C#Hash SHA256Managed不等于TSQL SHA2_256

我使用散列密码和salt(用户名).

问题是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,saltBytes.Length);

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

我想这与编码有关.
但我不知道如何解决这个问题.

UserName是varchar(50)

DB是现有的,因此更改varchar并不容易.

我已经尝试过:

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

解决方法

如果您的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);

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...