有没有办法用Spring Security检查PHP创建的bcrypt哈希?

时间:2018-10-31 12:38:59

标签: java php spring spring-security bcrypt

上下文

我正在使用更新的bcrypt算法处理PHP系统(因为底层算法中存在一个已知漏洞)。

因此,PHP的password_hash函数现在会生成以$2y$开头的哈希,因为旧的(以$2a开头)很容易受到攻击。

我在另一个Java系统中使用的Spring Security的BCrypt会生成原始的$2a$哈希,因为它的基础实现(jBCrypt而不是mentioned in this SO post的C BCrypt)不容易受到攻击同样的攻击。<​​/ p>

问题

在Spring Security中检查PHP生成的哈希不起作用。是否可以使用Spring Security检查PHP生成的哈希?

示例

php > $pwd = password_hash('foo', PASSWORD_BCRYPT, ['cost' => 12]);
php > echo $pwd;
$2y$12$TRc5ZjcmDJ8oFaoR1g7LD.RCxBTUZnGXB66EN9h9rKtNWg.hd7ExK

然后使用Java + Spring Security:

@Test
public void decryptsPhpHash() {
    boolean result = BCrypt.checkpw("foo", "$2y$12$TRc5ZjcmDJ8oFaoR1g7LD.RCxBTUZnGXB66EN9h9rKtNWg.hd7ExK");
    assertThat(result).isTrue();
}

引发以下错误:

java.lang.IllegalArgumentException: Invalid salt revision

1 个答案:

答案 0 :(得分:2)

据我所知,PHP只是将字符a更改为y来区分它本身。只有PHP更改了此前缀。因此,也许只需将y改回a即可解决此问题。

  

2011年6月,在BCrypt的PHP实现crypt_blowfish中发现了一个错误。设置了第8位的字符处理不当。他们建议系统管理员更新其现有的密码数据库,用$ 2x $替换$ 2a $,以表明这些哈希值不好(并且需要使用旧的破算法)。他们还提出了让crypt_blowfish为固定算法生成的哈希值发出$ 2y $的想法。   其他人,包括规范的OpenBSD,都没有采用2x / 2y的想法。此版本标记更改仅限于crypt_blowfish。   https://en.wikipedia.org/wiki/Bcrypt

相关问题