13

ハッシュ化されたパスワードとソルト (ユーザー名) を使用しています。

問題は、c# のハッシュ値が、TSQL スクリプトによってデータベースに追加した初期値と等しくないことです。

TSQL:

UPDATE [Users]
SET Password = HASHBYTES('SHA2_256', 'test123'+UPPER([UserName]))
GO;

C#:

var passBytes = new UnicodeEncoding().GetBytes(pass);
var saltBytes = new UnicodeEncoding().GetBytes(userName.ToUpper());

var dataToHash = new byte[passBytes.Length + saltBytes.Length];
Array.Copy(passBytes, dataToHash, passBytes.Length);
Array.Copy(saltBytes, dataToHash, saltBytes.Length);

var sha = new SHA256Managed();
return sha.ComputeHash(dataToHash);

エンコーディングと関係があると思います。しかし、これを修正する方法がわかりません。

ユーザー名は varchar(50) です

DB は既存のものであるため、varchar の変更はそれほど簡単ではありません。

私はすでに試しました:

UPDATE [Users]
SET Password = HASHBYTES('SHA2_256', N'test123'+UPPER([UserName]))
GO;
4

4 に答える 4

10

SQL Server データベースが SQL_Latin1_General_CP1_CI_AS の既定の照合順序を使用するように構成されている場合、C# コードでコード ページ 1252 を使用して文字をバイトに変換します。したがって、同等の

HASHBYTES('SHA2_256', 'test123' + UPPER([UserName]))

byte[] data = Encoding.GetEncoding(1252).GetBytes("test123" + userName.ToUpper());
var sha = new SHA256Managed();
byte[] hash = sha.ComputeHash(data);
于 2013-10-06T21:22:16.050 に答える
5

ハッシュは、文字ではなくバイトで機能します。あなたがやっていることはHash(StringToBytes(str)). あなたのStringToBytesステップは異なります。SQL では ANSIvarchar文字列を使用し、C# では UTF-16 文字列を使用しています。どれが欲しいか決めて、それを使ってください。Unicode ( nvarchar) をお勧めします。

于 2013-10-06T19:13:40.333 に答える