CONVERT(NVARCHAR(100),HASHBYTES(N' SHA1',@ PasswordWithSalt),2)c#中的等价物

时间:2017-01-26 07:14:08

标签: c# sql sql-server hashbytes

我试图将身份验证从存储过程移到EF。 SQL本身返回2个结果。我该如何验证它们?

将根据表

中存储的值检查该值
ECC2065575DCBF977CD923996C598C3DC481404E

SQL语法:

Declare @Password AS NVARCHAR(256) = 'Quest_2016'

DECLARE @PasswordSalt AS NVARCHAR(5) = 'LCY''n'

DECLARE @PasswordWithSalt AS NVARCHAR(261) = @Password + @PasswordSalt

print @PasswordWithSalt

结果:1 Quest_2016LCY'n

print HASHBYTES(N'SHA1', @PasswordWithSalt )

结果2:0xECC2065575DCBF977CD923996C598C3DC481404E-----

print HASHBYTES(N'SHA1', 'Quest_2016LCY''n')

结果3:0x5E85AB2ED11CDB696BC0544131D7C8571F4F8FA8-----

这也是如何在C#

中实现的

sql hashbytes

1 个答案:

答案 0 :(得分:3)

这两个查询的问题是字符串值相同但字节不相同。

第一个查询

  

打印HASHBYTES(N' SHA1',@ PasswordWithSalt)

使用unicode编码获取字节,因此每个字符为2个字节(0x510075006500730074005F0032003000310036004C004300590027006E00)。

第二个查询

  

打印HASHBYTES(N' SHA1',' Quest_2016LCY'' n')

使用ASCII,以便每个字符都是一个字节。

要在第二个示例中使用N'为字符串添加相同的结果。它将告诉SQL服务器这是一个unicode字符串

  

打印HASHBYTES(N' SHA1',N' Quest_2016LCY'' n')

生成哈希0xECC2065575DCBF977CD923996C598C3DC481404E

在C#中你也可以使用SHA1来获取字符串的哈希值,这里你还需要具体说明字节编码

byte[] data = Encoding.Unicode.GetBytes(@"Quest_2016LCY'n");
byte[] hash = SHA1.Create().ComputeHash(data);
Console.Write(hash.Select(x=>x.ToString("X2")).Aggregate((x,y)=>x+y));

打印ECC2065575DCBF977CD923996C598C3DC481404E,但如果您将Encoding.Unicode更改为Encoding.ASCII,则会显示5E85AB2ED11CDB696BC0544131D7C8571F4F8FA8