BCrypt vs PBKDF2WithHmacSHA1

时间:2014-10-11 06:07:40

标签: java security bcrypt pbkdf2 jbcrypt

为了安全地哈希密码,我应该使用哪种算法? BCryptPBKDF2WithHmacSHA1

哪个更安全? PBKDF2WithHmacSHA1内置于Java中,而BCrypt可通过jBCrypt库获得(其中大多数都获得了正面评价)。

此外,如果我使用BCrypt,我应该将用户的密码输入限制为仅限55个字符(因为这是BCrypt的限制)?

如果您Java具体,那将会很有帮助 请注意,我会选择使密码更安全,更难以强制使用。

2 个答案:

答案 0 :(得分:4)

它们不一样,并且它们不是同样安全的。

在CPU上,它们都使用大约相同数量的资源,并且在保护密码方面大致相同。

问题归结为基于GPU的攻击。由于GPU的体系结构,bcrypt实际上比SHA1(或SHA256)更难运行。因此,PBKDF2 + sha1的并行化比bcrypt更容易。

要在其上添加一些实际数字,我们将从This presentation中提取。

Sha-1比md5贵3倍。因此,如果我们看一下慢速哈希函数幻灯片,我们可以得出结论,md5crypt比pbkdf2-sha1快约3倍。这是一个相当多的猜测,但它正处于我们正在寻找的范围内。

这意味着,对于等效的CPU运行时,我们可以预期PBKDF2-sha1在GPU集群上每秒运行大约2500万个哈希值。将其与BCrypt(成本5)进行比较,后者以每秒75千赫兹的速度运行。

这意味着在相同的成本设置下,PBKDF2 + sha1比bcrypt弱约1000倍。

请注意,PBDFK2 + sha512几乎和bcrypt一样慢。这与使用64位操作的SHA-512有关(在当今的GPU中它们不是原生的)。

简而言之,bcrypt比PBKDF2 + SHA1更安全。它比PBKDF2 + SHA512更安全,但没有多少余量。

这依赖于今天的GPU架构。将来,如果缓存大小和指令集发生显着变化,这些差异可能会消失。这就是为什么像scrypt这样的新算法存在的原因。

所以只需使用bcrypt。 And don't worry about the character limit

答案 1 :(得分:2)

这并不重要。

两者的安全性之间的差异并不足以达到有意义的选择。但是,如果您正在寻找一个彻底的讨论,请查看Eugene的评论中的两个链接

重要的是你正确的。

这意味着:

  • 选择正确的成本因子/迭代次数。如果您是彻底的,您将需要对服务器可以容忍的哈希函数的速度进行基准测试。较慢(=较高的成本因子/迭代计数)越好。为了给你一个球场号码,我的全盘加密软件已确定带有HmacSHA1的PBKDF2需要~10000次迭代才能运行50ms。
  • 正确使用salt:每个密码都需要一个随附的随机值(salt),它与散列一起存储并用作每次散列的输入。不要在每个密码that would be pepper上使用相同的盐,并且很高兴,但不能替代盐。
  • 以可升级的方式存储密码。在某些时候,您可能希望更改成本因子或添加胡椒值或将散列方案更改为scrypt,一旦被广泛接受。为此,数据库条目需要告知使用哪个参数选择来生成密码。例如,请参阅this commonly used unix passwords storage format

&#34;另外,如果我使用BCrypt,我应该将用户的密码输入限制为仅55个字符(因为这是BCrypt的限制)?&#34; < / p>

没有。使用SHA1或SHA256对密码进行一次哈希处理,并使用输出,就像之前使用过的密码一样。如果你想涂胡椒,这是做这个的地方。最后,如果听起来很麻烦,这可能是使用PBKDF2而不是bcrypt的决定性因素。