BCrypt是一个很好的哈希algorithm在C#中使用? 我在哪里可以find它?
我已经读过,当哈希密码,许多程序员推荐使用BCryptalgorithm。
我在C#编程,想知道是否有人知道BCrypt的一个很好的实现? 我find了这个页面 ,但是我真的不知道它是否是假的。
select密码散列scheme时应该注意什么? BCrypt是一个“好”的实现?
首先,一些重要的术语:
哈希(Hashing) – 取一个string并产生一系列无法恢复到原始string的字符的行为。
对称encryption – (通常被称为“encryption”) – 采用一个string并产生一系列字符的行为,通过使用encryption它的相同encryption密钥, 可以将字符序列解密为原始string。
彩虹表 ( Rainbow Table) – 包含所有字符变体的查找表,在特定的散列algorithm中进行散列。
盐 – 在散列之前附加到原始string的已知随机string。
对于.NET Framework,Bcrypt还没有经过validation的参考实现。 这很重要,因为无法知道现有实施中是否存在严重缺陷。 在这里你可以得到一个BCrypt for .NET的实现。 我对密码学知之甚less,不知道它是一个好的还是不好的实现。 密码学是一个非常深的领域。 不要试图build立自己的encryptionalgorithm 。 认真。
如果你要实现你自己的密码安全(叹气),那么你需要做几件事情:
- 使用相对安全的散列algorithm 。
- 在每个密码被哈希之前encryption每个密码。
- 为每个密码使用独特的长盐 ,并将盐与密码一起储存。
- 需要强密码 。
不幸的是,即使你这样做,一个坚定的黑客仍然可能找出密码,这只会花费他很长的时间。 这是你的主要敌人: 时间 。
bcryptalgorithm是有效的,因为密码比MD5要长五个数量级 ; (并且仍比AES或SHA-512长很多)。 它迫使黑客花费更多的时间来创build一个彩虹表来查找你的密码,使得你的密码不太可能被黑客攻击。
如果你正在腌制和密码化你的密码,而且每种盐都不同, 那么潜在的黑客就不得不为每一个盐的变化创build一个彩虹表 ,只需要一个彩虹表为一个盐渍+密码。 这意味着如果你有100万用户,黑客必须生成100万个彩虹表。 如果你为每个用户使用相同的盐,那么黑客只需要生成一个彩虹表来成功破解你的系统。
如果你不窜改你的密码,那么所有攻击者所要做的就是为每一个实现(AES,SHA-512,MD5)提取一个现有的彩虹表,看看是否有一个匹配的散列。 这已经完成了 ,攻击者不需要自己计算这些彩虹表 。
即使有这些, 你也必须使用好的安全措施 。 如果他们能够在您的网站上成功使用另一个攻击媒介(XSS,SQL注入,CSRF 等 ),那么好的密码安全并不重要。 这听起来像是一个有争议的陈述,但想一想:如果我可以通过SQL注入攻击获取所有的用户信息,或者我可以让你的用户通过XSS给我他们的cookies, 那么你的密码有多好安全是 。
其他资源:
- 杰夫·阿特伍德: .NETencryption简化 (伟大的散列概述)
- 杰夫·阿特伍德: 我刚刚login了你
- 杰夫阿特伍德: 你可能存储密码不正确
- 杰夫·阿特伍德: 速度哈希
注意:请推荐其他好的资源。 我已经读了十几位作者的十几篇文章,但很less有人像杰夫那样写这个主题。 请在文章中进行编辑。
你不能在.NET中使用 BCrypt。 您必须使用 PBKDF2作为内置的.NET框架实现。 它是.NET中唯一免费提供的encryptionvalidation实现,同时也是NIST推荐的algorithm 。
StackId以前使用过BCrypt并移到PBKDF2,原因如下:
对于那些好奇的人,我们用PBKDF2哈希密码。 相关代码在这里( http://code.google.com/p/stackid/source/browse/OpenIdProvider/Current.cs#1135 ),通过间接几层。 在之前的迭代中,我们使用了BCrypt; 但移植到了.NET框架中的PBKDF2中,而BCrypt则要求我们validation一个实现(不是小事)。
凯文蒙特罗斯,2011年5月27日
(更新GitHub上的链接)
编辑:在encryption术语中validation的含义似乎不容易被理解,一个validation的实现意味着它被encryptioncertificate实施没有错误。 这个成本很容易达到$ 20,000或更高。 回想一下,当我在研究OpenSSL时,他们说他们没有完成整个validation过程,但是如果您需要充分validation,他们可以为您指出正确的path,并提到相关成本。 某些政府要求包括validationencryptionalgorithm的要求。
.NET中的bcrypt实现尚未得到validation。 使用未经validation的encryption实现,您不能绝对确定其中不存在任何有意的恶意错误,例如允许后门进入encryption或无意的实现错误,从而导致密码不安全的数据。
2014年编辑:任何人质疑使用validation的cryptopgraphicalalgorithm的必要性看看在OpenSSL中利用的heartbleed黑客造成的破坏。 这是使用未经validation的实现的成本。 这是安全的….直到你发现任何人只能读取你的服务器的整个内存内容。
介绍Heartbleed的变化作者Robin Seggelmann说,他“错过了validation一个包含长度的variables”,并且否认有意提交有缺陷的实现。 在Heartbleed披露之后,Seggelmannbuild议关注第二个方面,指出OpenSSL没有被足够的人审阅。
这是一个未经validation的实现的定义。 即使是最小的缺陷也可能导致整个安全性受损。
2015年编辑:删除基于推荐的语言,并取代绝对。 embedded式原创凯文·蒙特罗斯评论后人。