验证在 SQL Server 2012 中存储的加密密码
本文关键字:存储 加密 密码 2012 SQL Server 验证 | 更新日期: 2023-09-27 18:34:22
在SQL Server中,我运行一个命令:
Select HASHBYTES('SHA2_256', '12345678') as EncryptedString
它给出0xEF797C8118F02DFB649607DD5D3F8C7623048C9C063D532CC95C5ED7A898A64F
这个字符串作为输出,这个字符串有 66 个字符。
在同一侧,我尝试从 C# 代码加密密码,使用以下命令:
public string GetSHAEncryptedCode(string Text)
{
//SHA1 sha26 = new SHA1CryptoServiceProvider();
SHA256 sha26 = new SHA256CryptoServiceProvider();
byte[] sha256Bytes = System.Text.Encoding.UTF8.GetBytes(Text);
byte[] cryString = sha26.ComputeHash(sha256Bytes);
string sha256Str = string.Empty;
for (int i = 0; i < cryString.Length; i++)
{
sha256Str += cryString[i].ToString("X");
}
return sha256Str;
}
Suupose,如果我在 C# 代码中输入相同的"12345678",它会返回一个 62 个字符长的字符串,字符串EF797C8118F02DFB64967DD5D3F8C762348C9C63D532CC95C5ED7A898A64F
。现在,我如何验证来自sql server的加密字符串和来自C#代码的另一个字符串,以便从登录页面登录用户?
您的 C# 格式字符串不正确 - 当十六进制值小于 10
时,它缺少前导 0
s。
相反,您需要使用 "X2"
作为格式字符串,以便将其填充为 2 个数字:
public string GetSHAEncryptedCode(string Text)
{
//SHA1 sha26 = new SHA1CryptoServiceProvider();
SHA256 sha26 = new SHA256CryptoServiceProvider();
byte[] sha256Bytes = System.Text.Encoding.UTF8.GetBytes(Text);
byte[] cryString = sha26.ComputeHash(sha256Bytes);
string sha256Str = string.Empty;
for (int i = 0; i < cryString.Length; i++)
{
sha256Str += cryString[i].ToString("X2");
}
return sha256Str;
}
这将正确返回EF797C8118F02DFB649607DD5D3F8C7623048C9C063D532CC95C5ED7A898A64F
然后您可以将0x
附加到开头。
无论如何,无论如何都不应该真正将值转换为字符串。 HASHBYTES()
和 sha256.ComputeHash()
都返回字节数组,因此仅比较它们更有效、更安全。您可以使用本答案中描述的方法执行此操作。
或者也许更好的是,我假设您将密码作为加密存储在数据库中(不是吗...?),因此只需将输入值加密为 C# 中的字节数组,然后将其传递给数据库并使用类似的东西
SELECT * FROM users WHERE username = @username AND password = @passwordBytes