等同于 C# 中的 SQL Server HASHBYTES('sha1', @userpwd)

Equivalent of SQL Server HASHBYTES('sha1', @userpwd ) in C#

我正在尝试将一些存储过程迁移到 C# 代码。

我正在尝试在 C# 代码中找到此函数 HASHBYTES('sha1', password) 的等价物。

T-SQL 中 HASHBYTES('sha1', "Glenw00d@3") 的生成值是 "зmG>”TëÏåÈ“ÇOó26¥"

C# 是否具有此 T-SQL 函数的等效项?

更新:

我尝试使用此代码:

  public static class SHA1Util
  {
        /// <summary>
        /// Compute hash for string encoded as UTF8
        /// </summary>
        /// <param name="s">String to be hashed</param>
        /// <returns>40-character hex string</returns>
        public static string SHA1HashStringForUTF8String(string s)
        {
            byte[] bytes = Encoding.UTF8.GetBytes(s);

            var sha1 = SHA1.Create();
            byte[] hashBytes = sha1.ComputeHash(bytes);

            return HexStringFromBytes(hashBytes);
        }

        /// <summary>
        /// Convert an array of bytes to a string of hex digits
        /// </summary>
        /// <param name="bytes">array of bytes</param>
        /// <returns>String of hex digits</returns>
        public static string HexStringFromBytes(byte[] bytes)
        {
            var sb = new StringBuilder();
            foreach (byte b in bytes)
            {
                var hex = b.ToString("x2");
                sb.Append(hex);
            }
            return sb.ToString();
        }
    }

但它 returns 不同的结果。

var hashString = SHA1Util.SHA1HashStringForUTF8String("Glenw00d@@3");//result for this was d0b76d473e945417ebcf18e5c893c74ff33236a5

除非您更改默认编码,否则通常 SQL 服务器使用 Windows-1252 表示 VARCHAR()

private static readonly Encoding Encoding1252 = Encoding.GetEncoding(1252);

/// <summary>
/// Compute hash for string encoded as Windows-1252
/// </summary>
/// <param name="s">String to be hashed</param>
/// <returns>40-character hex string</returns>
public static string SHA1HashStringForDefaultString(string s)
{
    byte[] bytes = Encoding1252.GetBytes(s);

发现问题:

您正在散列两个不同的字符串

HASHBYTES('sha1', "Glenw00d@3") 

SHA1Util.SHA1HashStringForUTF8String("Glenw00d@@3")

看到 @/@@?

现在,对于编码,我会说它是 Windows-1252。但是你可以检查

Select TABLE_NAME, COLUMN_NAME, Columns.COLLATION_NAME From INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Yourtable'

如果您的列的排序规则包含 CP1 then it is Windows-1252

对于输出...如果您想要一个字符串,请将 return 替换为:

return Encoding1252.GetString(hashBytes);

对于 Glenw00d@@3 哈希是:0LdtRz6UVBfrzxjlyJPHT/MyNqU=

如果你想要一个十六进制字符串,请保持 return 不变,

对于 Glenw00d@@3 哈希是:d0b76d473e945417ebcf18e5c893c74ff33236a5

如果你想要 base64:

return Convert.ToBase64String(hashBytes);

对于 Glenw00d@@3 哈希是:0LdtRz6UVBfrzxjlyJPHT/MyNqU=