博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP实现 bcrypt,如何使php中的bcrypt和Java中的jbcrypt兼容
阅读量:1532 次
发布时间:2019-04-21

本文共 1882 字,大约阅读时间需要 6 分钟。

我想在php中创建注册页面,并用bcrypt将密码散列并放入数据库中。

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

我怎样才能使jbcrypt和bcrypt在php中兼容,并且使用相同的盐。

清晰的语法

您可以查看以下内容:

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();

}

控制台-输出

8362e690dc018667e5abbc99beb66773.png

希望对您有所帮助。

它为我工作! 非常感谢你@cristianippolito

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

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

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

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

(有关详细信息,请参阅维基百科文章)

当前,jBcrypt(0.4)仅支持$2a$。

有两种可能性:

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的作者 sub>

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

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

如果要了解有关bcrypt生成的哈希中的前缀的更多信息,请阅读本文。

转载地址:http://ekudy.baihongyu.com/

你可能感兴趣的文章
详解循环神经网络(Recurrent Neural Network)
查看>>
为什么要用交叉验证
查看>>
用学习曲线 learning curve 来判别过拟合问题
查看>>
用验证曲线 validation curve 选择超参数
查看>>
用 Grid Search 对 SVM 进行调参
查看>>
用 Pipeline 将训练集参数重复应用到测试集
查看>>
PCA 的数学原理和可视化效果
查看>>
机器学习中常用评估指标汇总
查看>>
什么是 ROC AUC
查看>>
Bagging 简述
查看>>
详解 Stacking 的 python 实现
查看>>
简述极大似然估计
查看>>
用线性判别分析 LDA 降维
查看>>
用 Doc2Vec 得到文档/段落/句子的向量表达
查看>>
使聊天机器人具有个性
查看>>
使聊天机器人的对话更有营养
查看>>
一个 tflearn 情感分析小例子
查看>>
attention 机制入门
查看>>
手把手用 IntelliJ IDEA 和 SBT 创建 scala 项目
查看>>
GAN 的 keras 实现
查看>>