gpt4 book ai didi

php - 比较 PHP 和 NodeJS 之间的 BCrypt 哈希

转载 作者:IT老高 更新时间:2023-10-28 22:02:48 25 4
gpt4 key购买 nike

对于我正在开发的应用程序,nodejs 需要验证 PHP 创建的哈希值,反之亦然。

问题是,在 PHP 中生成的哈希(通过 Laravel 的 Hash 类,它只使用 PHP 的 password_hash 函数)在 node.js 中测试时返回 false。

以下 node.js 脚本:

var bcrypt = require('bcrypt');

var password = 'password';

var phpGeneratedHash = '$2y$10$jOTwkwLVn6OeA/843CyIHu67ib4RixMa/N/pTJVhOjTddvrG8ge5.';
var nodeGeneratedHash = '$2a$10$ZiBH5JtTDtXqDajO6f4EbeBIXGwtcGg2MGwr90xTH9ki34SV6rZhO';

console.log(
bcrypt.compareSync(password, phpGeneratedHash) ? 'PHP passed' : 'PHP failed',
bcrypt.compareSync(password, nodeGeneratedHash) ? 'nodejs passed' : 'nodejs failed'
);

输出:'PHP failed nodejs pass',而以下 PHP 脚本:

<?php

$password = 'password';

$phpGeneratedHash = '$2y$10$jOTwkwLVn6OeA/843CyIHu67ib4RixMa/N/pTJVhOjTddvrG8ge5.';
$nodeGeneratedHash = '$2a$10$ZiBH5JtTDtXqDajO6f4EbeBIXGwtcGg2MGwr90xTH9ki34SV6rZhO';

print password_verify($password, $phpGeneratedHash) ? 'PHP passed' : 'PHP failed';
print password_verify($password, $nodeGeneratedHash) ? 'nodejs passed' : 'nodejs failed';

输出'PHP 已通过,nodejs 已通过'。

我使用 PHP 5.5.18、node.js v0.10.32 和 npm bcrypt 模块在 Ubuntu 14.04.1 中运行了测试。

最佳答案

这会失败,因为从 php 和 node 生成的 bcrypt 哈希的类型不同。 Laravel 生成 $2y$ 而 node 生成 $2a$。但好消息是 2a2y 之间的唯一区别是它们的前缀。

所以你可以做的是让一个前缀与另一个相似。喜欢:

$phpGeneratedHash  = '$2y$10$jOTwkwLVn6OeA/843CyIHu67ib4RixMa/N/pTJVhOjTddvrG8ge5.';
$nodeGeneratedHash = '$2a$10$ZiBH5JtTDtXqDajO6f4EbeBIXGwtcGg2MGwr90xTH9ki34SV6rZhO';

类似于:

$phpGeneratedHash  = '$2y$10$jOTwkwLVn6OeA/843CyIHu67ib4RixMa/N/pTJVhOjTddvrG8ge5.';
$nodeGeneratedHash = '$2y$10$ZiBH5JtTDtXqDajO6f4EbeBIXGwtcGg2MGwr90xTH9ki34SV6rZhO';

请注意,我将 Node 哈希的 $2a$ 替换为 $2y$。你可以简单地这样做:

PHP

$finalNodeGeneratedHash = str_replace("$2a$", "$2y$", $nodeGeneratedHash);

Node

finalNodeGeneratedHash = nodeGeneratedHash.replace('$2a$', '$2y$');

然后将 phpGeneratedHashfinalNodeGeneratedHash 进行比较。

Note: It is recommended that if you're comparing in PHP, change the prefix of the NodeJS generated hash to $2y$ and if you're comparing in NodeJS; change the prefix of the PHP generated hash to $2a$.

关于php - 比较 PHP 和 NodeJS 之间的 BCrypt 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26643587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com