【问题标题】:CONVERT(NVARCHAR(100), HASHBYTES(N'SHA1', @PasswordWithSalt ),2) equivalent in c#CONVERT(NVARCHAR(100), HASHBYTES(N'SHA1', @PasswordWithSalt),2) 等效于 c#
【发布时间】:2017-01-26 07:14:07
【问题描述】:

我正在尝试将身份验证从存储过程转移到 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

【问题讨论】:

    标签: c# sql sql-server hashbytes


    【解决方案1】:

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

    第一个查询

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

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

    第二个查询

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

    使用 ASCII,因此每个字符都是一个字节。

    要在第二个示例中获得相同的结果,请在字符串前面加上 N'。它会告诉 SQL Server 这是一个 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

    【讨论】:

      猜你喜欢
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      相关资源
      最近更新 更多