java - BCrypt 与 PBKDF2WithHmacSHA1

标签 java security bcrypt pbkdf2 jbcrypt

<分区>

为了安全地散列密码,我应该使用哪种算法? BCrypt 还是 PBKDF2WithHmacSHA1

哪个更安全? PBKDF2WithHmacSHA1 内置于 Java 而 BCrypt 可通过 jBCrypt 获得库(大部分都收到正面评价)。

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

如果您是特定于 Java 的,那将会很有帮助。
请注意,我会选择使密码更安全和暴力破解更困难的选项。

最佳答案

它们不一样,也不同样安全。

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

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

为了在上面加上一些实际数字,我们将从 This presentation 中提取.

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

这意味着,对于同等的 CPU 运行时间,我们可以预期 PBKDF2-sha1 在 GPU 集群上每秒运行约 2500 万个哈希。将其与每秒运行 75,000 个哈希的 BCrypt(成本为 5)进行比较。

这意味着 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

关于java - BCrypt 与 PBKDF2WithHmacSHA1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26311686/

相关文章:

java - jpa 2.1 和新的 Date APi : YearMonth to Date Converter, MySQL 异常

java - 条件变量和锁的使用

php - PHP:如何禁用危险功能

java - 使用小程序在客户端系统上写入文件

android - 展示如何使用 Android ID 认证的示例代码

node.js - 密码哈希+盐如何工作

javascript - 在使用 POST 方法发送密码之前,有没有办法用 bcrypt 散列密码?

java - 如何从jsp中的数组项中选择不同的值

java - JDBC 连接池内存问题(Java EE 应用程序)

php - 如何在 symfony 中使用 bcrypt 密码加密添加管理员?