关于C#:Rijndael密码哈希算法的替代方案

Rijndael algorithm alternative for password hashing

当我选择密码加密时,我发现Rijndael算法是最好的加密方法之一,无法通过蛮力攻击来破解。

所以我选择了Rijndael算法来加密用户的密码。

现在我已经确定,散列(不可逆)比加密(可逆)更安全[如果我错了,请纠正我]

我的问题是,

  • 我可以使用现有的实现Rijndael算法
  • 如果我不应该进行加密,那么哪一个应该是最好的哈希算法。
  • 在实现Rijndael算法时,我已经参考了以下网站。

    http://msdn.microsoft.com/zh-cn/library/system.security.cryptography.rijndael(v = vs.110).aspx

    如何使用密码生成Rijndael KEY和IV?

    http://www.obviex.com/samples/encryption.aspx


    OWASP列出了一些密码存储的良好做法。

    您基本上可以应用protection_function将凭证转换为受保护的形式:
    [protected form] = [salt] + protect([protection func], [salt] + [credential]);

    您还要添加一个salt,以便同一凭证的两个版本具有不同的存储形式。

    他们还列出了选择哈希函数的顺序(是的,哈希比加密更好,这样即使网站所有者也无法对密码进行反向工程)。 Argon2和PBKDF通常是protection_function的不错选择。

    也请阅读本指南的其余部分。与此相关的Security SE帖子还介绍了为什么AES(即Rijndael)加密的密码存储甚至比不那么强的哈希还要糟糕(@Salvador的评论)。


    加密问题是,攻击者获得密钥后,便可以立即解密数据库的所有密码,因此知道可以在其他站点尝试的原始密码。

    由于哈希是不可逆的(无法取回原始密码),即使攻击者可以控制服务器,也无法使用哈希。网站所有者也是如此。

    当今推荐的算法是BCrypt,PBKDF2和SCrypt,它们都具有成本因素,可以控制计算单个哈希的必要时间。需要的时间越长,暴力破解就越困难。