How can I make bcrypt in php and jbcrypt in java compatible
我想在php中创建注册页面,并用bcrypt将密码散列并放入数据库中。
我还想用Java创建一个登录系统,并使用jbcrypt获得与该密码相同的密码。
我怎样才能使jbcrypt和bcrypt在php中兼容,并且使用相同的盐。
您可以查看以下内容:
https://github.com/ircmaxell/password_compat/issues/49
这对我有用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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(); } |
控制台-输出
希望对您有所帮助。
问题在于,带有
因此,OpenBSD使用的版本是
1 | $2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO |
与
1 | $2a$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO |
(有关详细信息,请参阅维基百科文章)
当前,jBcrypt(0.4)仅支持
有两种可能性:
1.在将版本标识符传递给jBcrypt之前,对其进行手动替换(hack)
1 | String hash_php ="$2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO".replaceFirst("$2y$","$2a$"); |
2.使用支持自定义版本标识符的其他实现
这就是我为bcrypt实现新库(基于jBcrypt)的原因。 https://github.com/patrickfav/bcrypt
像这样使用它(默认情况下不会验证版本,在这种情况下可以使用
1 2 | BCrypt.Result result = BCrypt.verifyer().verify(password.toCharArray(),"$2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO") if(result.verified) {...} |
如果要bcrypt创建
1 2 | String bcryptHash = BCrypt.with(BCrypt.Version.VERSION_2Y).hashToString(6, password.toCharArray()); // $2y$10$ss9kwE8iSIqcJOAPhZR0Y.2XdYXJTFJ1/wGq6SUv74vULE7uhKUIO |
完全免责声明:我是bcrypt的作者 sub>
如果从哈希中删除前7个字符($ 2y $ 10 $ / $ 2a $ 10 $),则无论使用哪种编程语言,其余字符都应相同。生成的哈希的第一个字符是一个前缀,可告诉更多有关哈希算法的信息。
在您的示例中,$ 2y $和$ a2 $定义了哈希算法,而10 $是哈希生成的"成本"(哈希算法被重复应用了多少次或诸如此类)。
如果要了解有关bcrypt生成的哈希中的前缀的更多信息,请阅读本文。