我目前正在为我们的一个客户开发一个Orchard CMS平台,这是一个拥有约400名成员的小型俱乐部。在另一位客户最近他们的网站遭到黑客攻击并且用户数据泄露后(记录:我们没有开发他们的网站),我们希望为我们当前和新客户提供最佳安全性。这并不意味着最好的安全性,我们只是想让网站足够安全,无论网站上找到什么数据都不值得攻击者为获得它而付出的努力。由于我们这个网站只有一个小会员池,我怀疑它的开头是否有吸引力,但考虑到最近的事件,我们不能太确定。
我们正在研究的主题之一是密码存储。我们不想吝啬这一点,因为这是安全的重要组成部分。我已经阅读了SHA512,BCrypt和其他哈希算法,但很难对在线发现的所有不同算法和方法形成清晰的概述。这些信息分布在不同的来源,其中一些可以在MSDN上找到,但其中一些只能隐藏在博客文章和评论中。
哈希和盐化密码及其他敏感数据的哪些算法目前被认为是最好的?还有哪些像瘟疫一样可以避免?
答案 0 :(得分:1)
PBKDF2 / RFC2898 / PKCS#5v2,BCrypt和SCrypt是当前存储密码的“好方法”。截至2014年初,所有其他方式都很糟糕。
看Orchard SetPassword,它似乎是一轮盐腌SHA-1。这太可怜了!有关一般性论文,请参阅How to securely hash passwords?。
在你的情况下,如果你想坚持使用纯.NET,我会说使用Rfc2898DeriveBytes Class,这是一个PBKDF2-HMAC-SHA-1实现,每个用户随机输入16字节盐由RNGCryptoServiceProvider Class生成(Orchard使用相同的类来生成它的盐),并且尽可能多的迭代期望在最大预期负载下位于CPU绑定服务器之下 - 该数字应该是几十个成千上万。
存储密码哈希,明文(二进制或十六进制字符串或Base64字符串)salt以及数据库中的迭代次数。应存储itersations的数量,以便以后轻松提高安全性。如果可能,还要存储“版本”,以便以后可以轻松升级到新算法。