1

電子メールがプレーンテキストでパスワードがSHA1として保存されているデータベースに保存されている資格情報に対して、ログインチェックを実行しようとしています。今のところ、ユーザーは手動で作成されています。ログインの詳細を確認するために、ストアドプロシージャを使用することにしました。ここに問題があります:

次のクエリは、SHA1でパスワードを返します。

SELECT HASHBYTES('SHA1', 'password') 
 // returns 0x5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8

次のクエリは、ユーザーの存在を確認します。

SELECT COUNT(*) from users where email='test@gmail.com'
 and password='0x5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8' // returns 1

そして、ここにストアドプロシージャ('password'がプレースホルダーであるプロシージャ全体から抽出されたselectステートメント)がありますが、これは本来のように1を返さないようです。

SELECT COUNT(*) from users where email='test@gmail.com'
 and password=(SELECT HASHBYTES('SHA1', 'password')) // returns 0

誰かが理由を知っていますか?

4

1 に答える 1

3

SELECT HASHBYTES()はタイプvarbinaryを返し、パスワード列はvarcharのようです。

OPで機能するソリューション:

SELECT COUNT(*) from users where email='test@gmail.com' and password=(master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', 'password'), 1, 0))
于 2012-11-20T18:22:32.530 に答える