相当于 C# 中的 SQL Server HASHBYTES('sha1', @userpwd )

2024-03-23

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

我试图找到这个函数的等效项HASHBYTES('sha1', password)在 C# 代码中。

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

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

UPDATE:

我尝试使用这段代码:

  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

除非您更改默认编码,否则 SQL Server 通常使用 Windows-1252VARCHAR().

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") 

and

SHA1Util.SHA1HashStringForUTF8String("Glenw00d@@3")

See the @/@@?

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

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

如果您的列的排序规则包含CP1那么它是Windows-1252 https://msdn.microsoft.com/en-us/library/ms180175.aspx.

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

return Encoding1252.GetString(hashBytes);

For Glenw00d@@3哈希值是:0LdtRz6UVBfrzxjlyJPHT/MyNqU=

如果你想要一个十六进制字符串,请保留返回值,

For Glenw00d@@3哈希值是:d0b76d473e945417ebcf18e5c893c74ff33236a5

如果你想要它的base64:

return Convert.ToBase64String(hashBytes);

For Glenw00d@@3哈希值是:0LdtRz6UVBfrzxjlyJPHT/MyNqU=

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

相当于 C# 中的 SQL Server HASHBYTES('sha1', @userpwd ) 的相关文章

随机推荐