散列密码或加密密码好吗?

时间:2013-01-24 19:24:19

标签: c# .net encryption hash cryptography

  

可能重复:
  Difference between Hashing a Password and Encrypting it
  Hashing vs. Encrypting Passwords

我尝试使用Rfc2898DeriveBytes在C#中散列我的密码,方法是将用户名作为其 盐值。

public string HashPassword(string HashedUsernameSalt, string Password)

{

    Rfc2898DeriveBytes HashedPass = new Rfc2898DeriveBytes(Password,
    System.Text.Encoding.Default.GetBytes(HashedUsernameSalt), 10000);
    return Convert.ToBase64String(Hasher.GetBytes(25));
}

上面的方法给了我一些哈希值。我的问题是

是否有可能取回我的密码以显示用户是否忘记了密码? 要么 我是否需要在此处实现其他一些概念,如加密和解密?,但我听说哈希比加密更好。

谢谢!

3 个答案:

答案 0 :(得分:7)

您绝对应该对密码使用单向散列。如果用户忘记了,您的目标应该是无法检索它。要做的是允许用户将密码(经过某种识别过程后)重置为一个全新的密码。

答案 1 :(得分:3)

你无法反转哈希,所以如果用户忘记密码则不会“不可恢复”。您不希望将加密密码存储在数据库中,而是希望存储这些哈希值。如果用户忘记了密码,您将生成一个新的临时安全密码(在正确识别用户是他们所说的用户之后)。

密码应该用盐进行哈希处理,否则很快就会被彩虹表破坏。

答案 2 :(得分:0)

从安全的角度来看,散列密码而不是加密密码确实要好得多。您必须管理用于加密密码的密钥,如果您未能保证密码安全(您可能会针对确定的攻击者),则攻击者可以以明文形式获取所有用户密码。

如果您想提供忘记密码机制,最好将电子邮件发送到文件地址并让用户创建新密码。或者实施安全问题。或两者都做。