验证在 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#代码的另一个字符串,以便从登录页面登录用户?

验证在 SQL Server 2012 中存储的加密密码

您的 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