生成密码哈希值

3
对于我的登录系统,我希望对数据库中的密码进行哈希处理。因此,我决定学习如何进行哈希处理,但不幸的是,我找不到我想要的示例,所以它对我来说并不太有意义。
我想实现这样的功能:当创建用户账户时,将密码哈希处理并存储在数据库中,然后当用户登录时,将登录密码进行哈希处理,并与数据库中的哈希密码进行比较。如果您理解我的意思,我会非常感激您的帮助。
如果您需要我的代码示例或其他内容,请告诉我,我会将其编辑到我的问题中。

我想你是指要对密码进行加密和解密?也许你只是查错了术语(“哈希”),这导致了混淆? - Thorsten Kettner
这里有一个很好的答案(https://dev59.com/_G855IYBdhLWcg3wuG2W#10402129),可能是你想要的。 - DrewJordan
@ThorstenKettner 我不确定,我读到过应该使用哈希而不是加密和解密? - imamage597
我的错,抱歉。看到DrewJordan的链接和Reza Aghaei的回答,你可能是对的。我只是不知道哈希用于验证密码。 - Thorsten Kettner
如果您想要对密码进行哈希并存储到数据库中,那么请查找盐值。它可以使哈希更加安全。 - Huntt
1个回答

9
您可以使用哈希算法,例如 MD5SHA1SHA265SHA512 等来哈希化密码。例如:
public string Hash(string password)
{
    var bytes = new UTF8Encoding().GetBytes(password);
    var hashBytes = System.Security.Cryptography.MD5.Create().ComputeHash(bytes);
    return Convert.ToBase64String(hashBytes);
}

将密码的哈希值存储在数据库中,当您想要将输入的密码与数据库存储的值进行比较时,请将输入值的哈希值与数据库值进行比较。

编辑

考虑使用SHA256SHA512代替MD5

public string Hash(string password)
{
    var bytes = new UTF8Encoding().GetBytes(password);
    byte[] hashBytes;
    using (var algorithm = new System.Security.Cryptography.SHA512Managed())
    {
        hashBytes = algorithm.ComputeHash(bytes);
    }
    return Convert.ToBase64String(hashBytes);
}

这只是一个简单的例子:在现实场景中,您还应该为哈希使用“盐”。您可以在这里阅读有关盐的更多信息。

1
对于这个问题,仍然使用MD5是否可以?我听到各种各样的事情... - DrewJordan
1
@DrewJordan 不,bcrypt 明显是更好的选择。 - Dmitry Savchenko
1
@imamage597 只需使用参数化查询,并将 Hash(passwordTextBox.Text) 作为 @Password 的值传递即可。 - Reza Aghaei
2
@DrewJordan 我添加了使用SHA512Managed的示例代码。但是对于bcrypt,OP应该使用BCrypt.NetBCryptCreateHash Windows API函数。希望你会觉得有帮助。 - Reza Aghaei
2
@Reza Aghaei 我不同意,有人询问哈希的原因是为了安全性,否则他们只会将密码保存为明文。如何进行哈希基本上应该在SO上讨论。如果我们已经因安全原因建议不要使用MD5,那么向读者提供一个好的方向并建议他们考虑使用盐来进行哈希也无妨。 - Huntt
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接