我想在 php 中创建注册页面,并使用 bcrypt 对密码进行哈希处理并放入数据库。
我也想用Java制作一个登录系统,并使用jbcrypt以相同的密码获取密码。
如何使用相同的盐使 php 中的 jbcrypt 和 bcrypt 兼容。
你可以看看这个:
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();
}
控制台 - 输出
我希望这对你有帮助。
问题是 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种可能:
String hash_php = "$2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO".replaceFirst("$2y$", "$2a$");
这就是我为 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的作者
如果您从哈希中删除前 7 个字符($2y$10$ / $2a$10$),那么无论您使用哪种编程语言,其余的都应该是相同的。生成的散列的第一个字符是一个前缀,可以更多地了解散列算法。
在您的示例中,$2y$和$a2$定义了哈希算法,而10$是哈希生成的“成本”(哈希算法重复应用了多少次或类似的东西)。