当前位置: 首页 > 面试题库 >

比较PHP和NodeJS之间的BCrypt哈希

朱令
2023-03-14
问题内容

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

问题是,在node.js中测试时,PHP中生成的哈希(通过Hash仅使用PHP password_hash函数的Laravel 类)返回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失败的nodejs通过”,而以下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通过的”。

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


问题答案:

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

因此,您可以做的是使其中一个前缀与另一个相似。喜欢:

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

像这样:

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

请注意,我$2a$将节点哈希的替换为$2y$。您可以使用以下方法简单地做到这一点:

PHP

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

node

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

然后比较phpGeneratedHashfinalNodeGeneratedHash

注意:如果在PHP中进行比较,建议将NodeJS生成的哈希值的前缀更改为$2y$,如果在NodeJS中进行比较,则建议将其更改为。将PHP生成的哈希值的前缀更改为$2a$



 类似资料:
  • 我正在尝试使用Sinatra和BCrypt实现一种看似非常简单的身份验证方法,但显然我遗漏了一些东西... 用户会预先分配一个临时密码,该密码以明文形式存储在DB中。 我根据临时口令进行身份验证,然后创建salt和password_hash,并将它们作为字符串写入db(本例中为mongo)。 为了进行身份验证,我从db和用户口令中获取salt进行比较。 bcrypt::Engine.hash_se

  • 我使用mitsuhiko的pbkdf2实现进行密码哈希: 此函数返回二进制摘要,然后将其编码在bas64中并保存到数据库中。此外,当用户登录时,Base64字符串被设置为cookie。 此函数用于密码哈希比较: 我想知道在安全性方面,二进制哈希和Base64字符串的比较是否有任何不同?例如,当用户登录时,我会计算提交密码的二进制摘要,从数据库中解码Base64字符串,然后比较两个二进制哈希,但是如

  • 本文向大家介绍C#和.NET Framework之间的比较,包括了C#和.NET Framework之间的比较的使用技巧和注意事项,需要的朋友参考一下 C#是一种编程语言,.NET框架是由Microsoft开发的软件框架。 .NET具有公共语言运行库(CLR),它是.NET框架的虚拟组件。框架是一大类库。 .NET不仅具有C#,而且还具有C#,您可以使用VB,F#等。为.NET Framework

  • 问题内容: 如何在PHP中比较时间? 我想这样说: 上面的代码无法正常打印。我期望如此。 问题答案: $ThatTime =”14:08:10”; if (time() >= strtotime($ThatTime)) { echo “ok”; } 使用(也考虑时区)的解决方案。

  • 我有一个网页,使用bcrypt加密用户名密码,这些密码然后存储在数据库中。我有一个运行在QT上的C++程序,它需要对用户进行身份验证,为了做到这一点,我必须加密用户输入的密码,并将其与数据库中的密码进行比较。这是正确的做法吗?如果是的话,我该如何做到这一点?用户输入的密码的加密必须与bcrypt的加密相同,我如何做到这一点?提前道谢。

  • 当有一个已定义的长值时,这种方法可以很好地工作。但是,当为null时,我不会得到结果。似乎运算符不能比较空值。 我尝试在子句中使用,但如果MAX结果为null,并且以下查询同时返回MAX Long值和null值,则只希望实体具有null值: 如何选择具有最大值的实体,或者如果没有设置,则获取为空的实体?