等同于 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=
我正在尝试将一些存储过程迁移到 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=