当前位置: 首页 > 编程语言 > C#

C#HashSHA256Managed不等于TSQLSHA2_256share

时间:2023-04-10 21:17:19 C#

C#HashSHA256Managed不等于TSQLSHA2_256我使用散列密码和盐(用户名)。问题是来自c#的散列值不等于我通过TSQL脚本添加到数据库的初始值。TSQL:UPDATE[Users]SETPassword=HASHBYTES('SHA2_256','test123'+UPPER([UserName]))GO;C#:varpassBytes=newUnicodeEncoding().GetBytes(pass);varsaltBytes=newUnicodeEncoding().GetBytes(userName.ToUpper());vardataToHash=newbyte[passBytes.Length+saltBytes.Length];Array.Copy(passBytes,dataToHash,passBytes.Length);Array.Copy(saltBytes,dataToHash,saltBytes.Length);varsha=newSHA256Managed();返回sha.ComputeHash(dataToHash);我想这与编码有关。但我不知道如何解决这个问题。UserName是varchar(50)数据库已存在,因此更改varchar不会那么容易。我试过:UPDATE[Users]SETPassword=HASHBYTES('SHA2_256',N'test123'+UPPER([UserName]))GO;在C#代码中,如果SQLServer数据库配置为使用SQL_Latin1_General_CP1_CI_AS的默认排序规则,则使用代码页1252将字符转换为字节。因此,等效于HASHBYTES('SHA2_256','test123'+UPPER([UserName]))是byte[]data=Encoding.GetEncoding(1252).GetBytes("test123"+userName.ToUpper());varsha=newSHA256Managed();byte[]hash=sha.ComputeHash(数据);散列适用于字节,而不是字符。你正在做的是Hash(StringToBytes(str))。您的StringToBytes步骤不同。在SQL中,您使用ANSIvarchar字符串和C#UTF-16字符串。决定你想要哪一个并使用它。我推荐Unicode(nvarchar)。在努力让它工作之后,这是我最终工作的示例:publicstringHash(stringinput){using(SHA256hasher=SHA256.Create()){//将输入字符串转换为字节数组并计算哈希.byte[]data=hasher.ComputeHash(Encoding.Unicode.GetBytes(input));//创建一个新的Stringbuilder来收集字节//并创建一个字符串。StringBuildersBuilder=newStringBuilder();//遍历散列数据的每个字节//并将每个字节格式化为十六进制字符串。for(inti=0;iTSQLdeclare@inputasnvarchar(max)='Test';select@input;declare@hashasvarbinary(max)=HASHBYTES('SHA2_256',@input);选择@hash;声明@resultasnvarchar(max)=CONVERT(NVARCHAR(MAX),@hash,2);select@result;这些将产生相同的结果。请注意,它使用的是nvarchar数据类型,而不是varchar。Encoding.UTF8.GetBytes(输入)=HASHBYTES('SHA2_256',@varcharVariable);Encoding.Unicode.GetBytes(输入)=HASHBYTES('SHA2_256',@nvarcharVariable);以上就是C#学习教程:C#HashSHA256Managedisnotequalto如果TSQLSHA2_256分享的所有内容对你有用,需要进一步了解C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: