4

Hashbytesを使用してSQLに保存されている一部のプレーンテキストパスワードを変換した後、.Netが適切に一致するハッシュを生成するように見えません。

パスワードの変換に使用されるSQL:

UPDATE Users
SET UserPassword = HASHBYTES('SHA1', UserPassword + CAST(Salt AS VARCHAR(36)))

ここで、ハッシュの生成に使用される.Netコードは次のとおりです。

Dim oSHA1 As New System.Security.Cryptography.SHA1CryptoServiceProvider
Dim bValue() As Byte
Dim bHash() As Byte

bValue = System.Text.Encoding.UTF8.GetBytes(sPlainTextPass)
bHash = oSHA1.ComputeHash(bValue)
oSHA1.Clear()

Dim sEncryptPass As String = String.Empty
For i As Integer = 0 To bHash.Length - 1
    sEncryptPass = sEncryptPass + bHash(i).ToString("x2").ToLower()
Next

いくつかの追加の注意事項:ソルトはデータベースに保存されます。sPlainTextPassには、パスワードとソルトがプレーンテキストで含まれています。ASCII、UTF7、UTF8などのいくつかの異なるエンコーディングを試しました。データベースフィールドは、私が理解していることからUTF8に一致するはずのvarcharです。

ヘルプ?

4

4 に答える 4

2

文字列をハッシュすることはできません。ハッシュできるのはバイトのみです。したがって、SQL Server では、エンコーディングを使用して文字列をバイトに変換する必要があります。

SQL Server は UTF8 をサポートしていません。それが何を使用しているかを調べ、アプリケーションでそのエンコーディングを一致させる必要があります。Encoding.Unicodenvarchar の場合、これをまれな特殊文字でテストしてみます。

「ハッシュバイトエンコーディング」についてグーグルで見つけたこのトピックに関するWeb上の情報があるようです:http://weblogs.sqlteam.com/mladenp/archive/2009/04/28/Comparing-SQL-Server-HASHBYTES- function-and-.Net-hashing.aspxブログ投稿には明らかなエラーが含まれており、信頼できないと言わざるを得ません。

于 2012-06-28T13:11:13.067 に答える
0

以前、Sybase SQLAnywhere でこの種のことが起こるのを見たことがあります。使用している SQL データベースによっては、独自にハッシュをソルトする場合があります。その場合、一致するハッシュを取得することはありません (DB の内部の仕組みを知らなければ、つまり)。

編集:

パスワードを比較する場合は、内部ソルトを考慮して、.NET ハッシュ化されたパスワードを DB に送信し、そこで再度ハッシュ化して、格納されている値と等しいかどうかを確認できます。もちろん、これは同様の方法でパスワードを保存したことを前提としています。

于 2012-06-27T19:18:35.377 に答える
0

T-SQL で varchar の代わりに nvarchar 型を使用すると、結果も一致します

于 2012-11-07T19:05:14.233 に答える