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

StackOverflow https://stackoverflow.com/questions/481160

  •  20-08-2019
  •  | 
  •  

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

我正在使用 C# 进行编程,想知道是否有人知道 BCrypt 的良好实现?我发现 这一页, ,但我真的不知道它是否是假的。

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

有帮助吗?

解决方案

第一,有些条款,是重要的:

哈希 -该法案采取串并产生一个字符序列,无法恢复到原来的字符串。

对称加密 -(通常称为'加')-该法案采取串并产生一个字符序列 可以 被解密的原串通过使用相同的加密钥匙加密的。

彩虹表 -一个查询表,其中包含的所有变化的字的散列在一个具体的散列算法。

-已知的随机的字符串附加到原来的字符串之前,它是哈.

为。净框架,Bcrypt还没有 验证 参照执行。这是重要的,因为没有办法知道如果有严重的缺陷在一个现有的实施。你可以得到一个执行情况 BCrypt。净这里.我不知道足够关于加密的说无论它是一个良好的或坏的执行情况。密码是一个非常深刻的领域。 不要试图建立自己的算法加密的.严重。

如果你要去实现你自己的密码安全(叹息),然后你需要做几件事:

  1. 使用 相对安全的散列算法.
  2. 盐每个密码之前,哈.
  3. 使用 独特和长期的盐每个密码, 和储存的盐用的密码。
  4. 需要强有力的密码.

不幸的是,甚至如果你做的这一切,一个判定黑客仍然有可能找出密码,就只是把他一个很长的时间。这是你的首席的敌人: 时间.

bcrypt算法的工作,因为它需要 五个 数量级长哈密码比MD5;(并且仍然远远长于AES或SHA-512).它迫使黑客花费更多的时间创建一个彩虹表查找您的密码,使它远远不可能是你的密码将处于危险之中的被黑客攻击。

如果你腌制和散列您的密码,每种盐是不同的, 然后一个潜在的黑客就必须创建一个彩虹表的每个变化盐, ,只需要有一个彩虹表一咸+哈密码。这意味着,如果你有1百万用户,黑客有产生1百万的彩虹表。如果您使用的是相同的盐为每一个用户,然后黑客只有产生1彩虹表成功地破解你的系统。

如果你不盐你的密码,那么所有的攻击者有要做的就是拉了一个现有的彩虹表对于每一个执行有(AES,SHA-512,MD5)和只是看到,如果一个相匹配的散列。此 已经做了, 、攻击者 不需要计算这些彩虹表自己.

即使有这一切, 你必须使用良好安全做法.如果他们可以成功地使用的另一次攻击向量(XSS,SQL注,比如以你, et。al。)在您的网站上,良好的安全密码没有关系。这听起来像是一个有争议的声明,但是想想看:如果我可以得到所有用户的信息通过SQL注射击,或者我可以让你的用户得到我们的饼干通过的XSS, 然后不管怎样好你的安全密码是.

其他资源:

  1. 杰夫*阿特伍德: .净密的简化 (伟大的概述,散列)
  2. 杰夫*阿特伍德: 我只是记录在因为你
  3. 杰夫*阿特伍德: 你可能存密码不正确
  4. 杰夫*阿特伍德: 速哈希

注: 请推荐其他的良好资源。我必须具有读一十二条通过的几十个作者,但很少写的明明白白的问题Jeff做。请编辑文章中作为你找到他们。

其他提示

不得使用 .NET 中的 BCrypt。你 必须使用 PBKDF2 与内置的 .NET 框架实现一样。它是 .NET 中唯一免费提供的经过加密验证的实现,同时也是 NIST推荐的算法.

StackId 之前使用 BCrypt 并出于以下原因迁移到 PBKDF2:

对于那些好奇的人,我们使用 PBKDF2 对密码进行哈希处理。Relavent代码在这里( http://code.google.com/p/stackid/source/browse/OpenIdProvider/Current.cs#1135),通过几层间接。在较早的迭代中,我们正在使用bcrypt。但是将其内置到.NET框架中,而Bcrypt将搬到PBKDF2,而Bcrypt将要求我们验证实施(无小承诺)。

凯文·蒙特罗斯,2011 年 5 月 27 日

(更新了 GitHub 上的链接)

编辑: 的含义 已验证 用密码学术语来说似乎不容易理解,经过验证的实现意味着它已经通过密码学证明可以无错误地实现。其成本很容易达到 20,000 美元或更高。我记得当我对 OpenSSL 进行研究时,并读到他们表示尚未完成整个验证过程,但如果您需要完全验证,他们可以为您指出正确的路径并提到相关成本。某些政府要求包括对经过验证的加密算法的强制要求。

.NET 中的 bcrypt 实现尚未经过验证。使用未经验证的加密实现,您无法绝对确定其中不存在故意的恶意错误(例如允许后门进入加密内容)或无意的实现错误,从而导致加密数据不安全。

2014年编辑: 对于任何质疑使用经过验证的加密算法的必要性的人来说,看看由加密算法造成的破坏 心血黑客 在 OpenSSL 中被利用。这就是使用未经验证的实现的成本。很安全....直到您发现任何人都可以读取您服务器的整个内存内容。

引入 Heartbleed 的更改的作者 Robin Seggelmann 表示,他“错过了验证包含长度的变量”,并否认有任何提交有缺陷的实现的意图。在 Heartbleed 披露之后,Seggelmann 建议关注第二个方面,指出 OpenSSL 没有得到足够多的人审查。

这是未经验证的实现的定义。即使是最小的缺陷也可能导致整个安全性的瘫痪。

2015年编辑: 删除了基于推荐的语言并用绝对值替换。为后代嵌入凯文·蒙特罗斯 (Kevin Montrose) 的原创评论。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top