3

我想在 php 中创建注册页面,并使用 bcrypt 对密码进行哈希处理并放入数据库。

我也想用Java制作一个登录系统,并使用jbcrypt以相同的密码获取密码。

如何使用相同的盐使 php 中的 jbcrypt 和 bcrypt 兼容。

4

3 回答 3

5

你可以看看这个:

https://github.com/ircmaxell/password_compat/issues/49

这对我有用:

public static void main(String[] args) {
    //Laravel bcrypt out
    String hash_php = "$2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO".replaceFirst("2y", "2a");
    System.out.println("hash php " + hash_php);
    //String a_hash = BCrypt.hashpw("123456", BCrypt.gensalt());
    //System.out.println("Encrypt " + a_hash);
    if (BCrypt.checkpw("123456", hash_php)) {
        System.out.println("It matches");
    } else {
        System.out.println("It does not match");
    }
    //mtPruebaRecuperarClave();

}

控制台 - 输出

[1]

我希望这对你有帮助。

于 2017-06-23T03:53:43.133 回答
4

问题是 PHP 有password_hash()它自己的版本方案,因为以前的实现有破坏性错误,应该可以识别旧的哈希值。

所以 OpenBSD 使用的版本是$2a$(将$2b$在未来的版本中)和password_hash()使用$2y$(以前$2x$),所以当然不会匹配,例如

$2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO

对比

$2a$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO

有关版本的更多信息,请参阅维基百科文章

目前 jBcrypt (0.4) 仅支持$2a$.

有2种可能:

1.在将版本标识符传递给jBcrypt之前手动替换它(hack)

String hash_php = "$2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO".replaceFirst("$2y$", "$2a$");

2.使用支持自定义版本标识符的不同实现

这就是我为 bcrypt(基于 jBcrypt)实现一个新库的原因。https://github.com/patrickfav/bcrypt

像这样使用它(默认情况下它不会验证版本,你可以verifyStrict()在这种情况下使用)

BCrypt.Result result = BCrypt.verifyer().verify(password.toCharArray(), "$2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO")
if(result.verified) {...}

如果您希望 bcrypt 创建$2y$哈希:

String bcryptHash = BCrypt.with(BCrypt.Version.VERSION_2Y).hashToString(6, password.toCharArray());
// $2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO

完全免责声明:我是bcrypt的作者

于 2018-08-13T14:16:35.087 回答
0

如果您从哈希中删除前 7 个字符($2y$10$ / $2a$10$),那么无论您使用哪种编程语言,其余的都应该是相同的。生成的散列的第一个字符是一个前缀,可以更多地了解散列算法。

在您的示例中,$2y$$a2$定义了哈希算法,而10$是哈希生成的“成本”(哈希算法重复应用了多少次或类似的东西)。

如果您想了解有关 bcrypt 生成的哈希中的前缀的更多信息,请阅读这篇文章

于 2019-09-24T16:29:23.907 回答