一尘不染

BCrypt是在C#中使用的良好哈希算法吗?在哪里可以找到它?[关闭]

c#

我已经读过,在对密码进行哈希处理时,许多程序员建议使用BCrypt算法。

选择密码哈希方案时应注意什么?BCrypt是“良好”的实现吗?


阅读 799

收藏
2020-05-19

共1个答案

一尘不染

首先,一些重要的术语:

散列
-采取字符串并产生一系列不能还原为原始字符串的字符的行为。

对称加密
-(通常简称为“加密”)-采取一个字符串并产生一系列字符的动作,这些字符序列 可以 通过使用对其进行加密的相同加密密钥来解密为原始字符串。

彩虹表
-查找表,其中包含在特定哈希算法中哈希的所有字符变体。


-在散列之前附加到原始字符串的已知随机字符串。

对于.NET Framework,Bcrypt尚没有 经过验证的
参考实现。这很重要,因为无法知道现有实现中是否存在严重缺陷。您可以在此处获得BCrypt
for .NET
的实现。我对密码学还不够了解,很难说它是一个好实现。密码学是一个非常深的领域。
不要尝试构建自己的加密算法 。说真的

如果要实现自己的密码安全性(叹气),那么您需要做几件事:

  1. 使用相对安全的哈希算法
  2. 在对每个密码进行哈希处理之前先对其加盐。
  3. 为每个密码使用唯一且较长的盐,然后将盐与密码一起存储。
  4. 需要强密码

不幸的是,即使您做了所有这些,一个坚定的黑客仍然可以潜在地找出密码,这将花费他很长时间。那是您的主要敌人: 时间

bcrypt算法的工作,因为它需要 5 个数量级更长的时间来散比MD5密码 ;
(并且仍然比AES或SHA-512长得多)。它迫使黑客花费更多的时间来创建彩虹表来查找您的密码,从而大大降低了密码被黑客入侵的可能性。

如果您正在对密码加盐和散列,并且每种盐都不同,那么潜在的黑客将不得不为salt的每种变体创建一个彩虹表,仅是为一个盐+散列密码创建一个彩虹表。这意味着,如果您有100万用户,那么黑客必须生成100万个彩虹表。如果您为每个用户使用相同的盐,那么黑客只需生成1个彩虹表即可成功入侵您的系统。

如果您不给密码加盐,那么攻击者所需要做的就是为其中的每个实现(AES,SHA-512,MD5)拔出一个现有的Rainbow表,然后看看是否与哈希匹配。这已经完成,攻击者 无需自己计算这些Rainbow表

即使有所有这些,您也必须使用良好的安全做法。如果他们可以在您的站点上成功使用其他攻击媒介(XSS,SQL Injection,CSRF
),则良好的密码安全性无关紧要。这听起来像是一个有争议的声明,但请考虑一下:如果我可以通过SQL注入攻击获取所有用户信息,或者可以让您的用户通过XSS给我他们的cookie,那么密码的好坏并不重要安全是

注意: 请推荐其他好的资源。我一定已经阅读了数十位作者的十几篇文章,但很少有文章像Jeff一样清楚地写过。找到后,请在文章中进行编辑。

2020-05-19