我了解到,在对密码进行哈希时,许多程序员建议使用BCrypt算法。
我在使用C#编程,想知道是否有一个好的BCrypt实现?我找到了这个页面,但我不确定它是否可信。
在选择密码哈希方案时需要注意什么?BCrypt是一个“好”的实现吗?
我了解到,在对密码进行哈希时,许多程序员建议使用BCrypt算法。
我在使用C#编程,想知道是否有一个好的BCrypt实现?我找到了这个页面,但我不确定它是否可信。
在选择密码哈希方案时需要注意什么?BCrypt是一个“好”的实现吗?
首先是一些重要的术语:
哈希 - 将字符串转换为一系列字符的行为,这些字符无法还原为原始字符串。
对称加密 -(通常只称为“加密”)- 将字符串转换为一系列字符的行为,可以通过使用相同的加密密钥进行解密以恢复原始字符串。
彩虹表 - 包含特定哈希算法中散列的所有字符变体的查找表。
盐 - 附加到原始字符串之前的已知随机字符串,然后对其进行哈希。
对于.NET Framework,Bcrypt尚未具有验证的参考实现。这很重要,因为无法知道现有实现中是否存在严重缺陷。您可以在此处获得.NET的BCrypt实现。我不了解足够的密码学知识来判断它是好还是坏的实现。密码学是一个非常深入的领域。不要尝试构建自己的加密算法。认真点。
如果您打算实现自己的密码安全措施(叹气),则需要执行以下几个操作:
不幸的是,即使你做到了这些,一个决心坚定的黑客仍然有可能破解密码,只不过需要更长的时间。这就是你的主要敌人:时间。
bcrypt算法之所以有效,是因为它需要比MD5慢五个数量级的时间来哈希密码;(并且仍然比AES或SHA-512慢得多)。它迫使黑客花费更多的时间创建彩虹表来查找你的密码,从而大大降低了密码被破解的风险。
如果您对密码进行盐值哈希,并且每个盐值都不同,那么潜在的黑客需要为每个盐值变化创建一个彩虹表,仅仅为了得到一个经过盐值和哈希处理的密码的彩虹表。这意味着如果您有100万个用户,则黑客必须生成100万个彩虹表。如果您为每个用户使用相同的盐值,则黑客只需生成1个彩虹表即可成功破解您的系统。其他资源:
注意:请推荐其他好的资源。我已经读了数十篇不同作者的文章,但很少有人像Jeff那样简明地写作。请在找到文章时编辑添加。
Kevin Montrose, May 27 2011 (在GitHub上更新链接)对于那些好奇的人,我们正在使用PBKDF2对密码进行哈希处理。相关代码在此处(http://code.google.com/p/stackid/source/browse/OpenIdProvider/Current.cs#1135),通过几层间接调用。在早期版本中,我们使用了BCrypt;但是转向PBKDF2是因为它已经内置在.NET框架中,而BCrypt需要我们验证其实现(这不是一个小任务)。
编辑:在加密术语中,“已验证”(verified)的含义似乎不容易被理解,已验证的实现意味着它在密码学上已经被证明没有错误。这个成本很容易达到20000美元或更高。我记得当我在研究 OpenSSL 时读到他们声称他们还没有完成整个验证过程,但如果您需要完全验证,他们可以为您指明正确的路径并提及相关成本。某些政府要求包括强制使用已验证的加密算法。
.NET 中的 bcrypt 实现尚未经过验证。使用未经验证的加密实现,您无法绝对确定其中没有故意的恶意错误,例如允许后门进入加密内容,或者由于意外的实现错误而导致密码学不安全的数据。
2014 年更新: 对于那些质疑使用已验证的加密算法的紧迫性的人,请看看 heartbleed hack 在 OpenSSL 中所造成的灾难。这就是使用未经验证的实现的代价。它很安全......直到你发现任何人都可以读取你的服务器的整个内存内容。
引入 Heartbleed 的更改的作者 Robin Seggelmann 表示,他“错过了验证包含长度的变量”,并否认提交有缺陷的实现的任何意图。在 Heartbleed 被披露后,Seggelmann 建议关注第二个方面,称 OpenSSL 没有被足够多的人审查。
这就是未经验证的实现的定义。即使是最小的缺陷也可能导致整个安全系统崩溃。
2015年编辑:移除了基于建议的语言,并用绝对语言进行替换。为了纪念,嵌入了原始的Kevin Montrose评论。