C#中的SQL Server HASHBYTES(' sha1',@ userpwd)的等价物

时间:2015-05-10 19:27:26

标签: c# sql-server stored-procedures hash encoding

我正在尝试将一些存储过程迁移到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();
        }
    }

但它会返回不同的结果。

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

1 个答案:

答案 0 :(得分:3)

除非您更改默认的编码,否则通常SQL Server将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 Encoding1252.GetString(hashBytes);

对于Glenw00d@@3,哈希值为:0LdtRz6UVBfrzxjlyJPHT/MyNqU=

如果你想要一个十六进制字符串,请保持原样,

对于Glenw00d@@3,哈希值为:d0b76d473e945417ebcf18e5c893c74ff33236a5

如果你想要它base64:

return Convert.ToBase64String(hashBytes);

对于Glenw00d@@3,哈希值为:0LdtRz6UVBfrzxjlyJPHT/MyNqU=