0

SQLServerで問題が発生しました。私の仕事は、PHPを使用して単純なSQLServerベースのユーザーシステムを実現することです。データベースはMMORPGでも使用されるため、データベース構造を変更したり、スキーマをハッシュしたりすることは許可されていません。私の問題の本当の原因は、パスワードが次のアルゴリズムによってハッシュされていることです

HashBytes('MD5', REVERSE(UPPER(@ID)) + @PW)

パスワードハッシュ「0x7CEE495091E11FF9560D3D0165133322000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000」に準拠するtest123およびpwhallo123というテストユーザーを作成しました。

この時点まで、すべてが明確である必要があります。でも、クエリでデータを取得しようとすると、結果が得られません。私はこのクエリを実行しました:

mssql_query("SELECT * FROM [DB_Member].[dbo].[Member] WHERE ID = 'test123' AND PW = HashBytes('MD5', REVERSE(UPPER('test123')) + 'hallo123')");

結果は返されません。しかし、このクエリを直接実行すると

mssql_query("SELECT * FROM [DB_Member].[dbo].[Member] WHERE ID = 'test123' AND PW = 0x7CEE495091E11FF9560D3D01651333220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);

問題なくデータを取得できます

私は今これに約8時間取り組んでいますが、問題を理解することはできません。

4

3 に答える 3

1

データ型を詳しく調べる必要があると思います。私の推測では、変数@IDと@PWは、ハッシュが生成されるcharデータ型です。'test123'と'hallo123'を挿入してクエリを試行するときは、ハッシュを作成したルーチンにあったchar(?)データ型と一致するように、後にスペースを追加する必要があります。

これは、charデータ型とvarcharデータ型の使用の違いを示す例です。

charを使用する

declare @PW char(25)
declare @ID char(25)

set @PW = 'hallo123'
set @ID = 'test123'

select (HashBytes('MD5', REVERSE(UPPER(@ID)) + @PW))

ハッシュ結果

0x9F1E0132F198216841E2608901D27115

varcharを使用する

declare @PW varchar(25)
declare @ID varchar(25)

set @PW = 'hallo123'
set @ID = 'test123'

select (HashBytes('MD5', REVERSE(UPPER(@ID)) + @PW))

ハッシュ結果

0x870B01D196916AFA88EBC900BE5395BE

ハッシュは明らかに一致しません。

ハッシュの後にゼロがたくさんある理由は、ハッシュがbinary(60)フィールドに格納されているためです。HashBytesはVarBinaryを返しますが、それがクエリが失敗する理由ではありません。SQL Serverは、バイナリとVarBinaryを比較するときに、ある種の変換を行います。

于 2011-02-05T22:37:07.660 に答える
0

使用している言語が奇妙にエンコードされている可能性はありますか?SQLプロファイラーを起動し、送信されているクエリを調べて、違いを見つけることができるかどうかを確認するとどうなりますか?

于 2011-02-05T14:20:03.183 に答える
0

を実行するSELECT HashBytes('MD5', REVERSE(UPPER('test123')) + 'hallo123')と、結果は0x870B01D196916AFA88EBC900BE5395BEになります。ハッシュの作成が正しく、テストユーザーの作成時に正しいIDとパスワードを使用したことを確認しますか?

于 2011-02-05T14:20:22.540 に答える