我使用散列密码和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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。