如何在java兼容的php和jbcrypt中创建bcrypt

时间:2017-06-18 11:12:52

标签: java php bcrypt jbcrypt

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

我还想用Java创建一个登录系统,并使用jbcrypt以相同的密码获取密码。

如何在php兼容的情况下使jbcrypt和bcrypt使用相同的盐。

2 个答案:

答案 0 :(得分:1)

问题在于,带有password_hash()的PHP具有自己的版本方案,这是因为以前的实现存在一些令人毛骨悚然的错误,应该可以识别旧的哈希值。

因此,OpenBSD使用的版本为$2a$(在将来的版本中将为$2b$),而password_hash()使用$2y$(先前为$2x$),因此当然,将不匹配例如

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

vs

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

see the wikipedia article about more info on the versions

当前,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

的作者

答案 1 :(得分:0)

如果从哈希中删除前7个字符($ 2y $ 10 $ / $ 2a $ 10 $),则无论使用哪种编程语言,其余字符都应相同。生成的哈希的第一个字符是一个前缀,可以告诉更多有关哈希算法的信息。

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

If you want to learn more about the prefixes in the bcrypt generated hashes, read this article