我正在尝试将身份验证从存储过程移动到 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 哈希字节
这两个查询的问题在于字符串值相同,但字节不同。
第一个查询
打印哈希字节(N'SHA1', @PasswordWithSalt )
使用 Unicode 编码获取字节,因此每个字符为 2 个字节 (0x510075006500730074005F0032003000310036004C004300590027006E00)。
第二个查询
打印哈希字节(N'SHA1', 'Quest_2016LCY''n')
使用 ASCII,使每个字符都是一个字节。
要在第二个示例中获得相同的结果,请在字符串前面加上 N'
.它会告诉SQL服务器这是一个Unicode字符串。
打印哈希字节(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
。