如何在 NODE.JS 上模拟 php crypt()

Posted

技术标签:

【中文标题】如何在 NODE.JS 上模拟 php crypt()【英文标题】:How to mimic php crypt() on NODE.JS 【发布时间】:2021-11-18 04:14:32 【问题描述】:

请帮助 php -> javascript(node.js) 转换

$key = crypt($key, $salt);

我正在用 node.js 重写 php 脚本,我遇到了在 php 中生成哈希签名的问题,这是使用 crypt() 函数和盐匹配“CRYPT_EXT_DES”模式生成的

CRYPT_EXT_DES - 扩展的基于 DES 的散列。 “salt”是一个 9 字符的字符串,由一个下划线后跟 4 个字节的迭代计数和 4 个字节的 salt 组成。这些被编码为可打印字符,每个字符 6 位,最低有效字符在前。值 0 到 63 被编码为“./0-9A-Za-z”。在 salt 中使用无效字符会导致 crypt() 失败。

我对加密并没有真正的经验,研究有关加密模块的 node.js 文档也没有帮助。请帮助如何在 node.js 上实现这个!

【问题讨论】:

你试过什么代码? 没什么,我真的不知道从哪里开始。 crypto 的 createHash/createHMac/createSign 在我的机器上不支持“DES”算法,它仅适用于多种变体的密码,但 php 的 crypt() 是单向字符串散列,不应该被破译,所以我猜密码不是正确的工具。 【参考方案1】:

看起来crypt(3) 库应该可以工作。

例如:

const crypt = require( 'crypt3/sync' ),
      key = "password",
      hash = crypt( key, crypt.createSalt( 'sha512' ) );

然后测试存储的哈希...

const crypt = require( 'crypt3/sync' ),
      key = "password",
      hash = /* stored hash */;

if ( crypt( key, hash ) !== hash ) 
  // access denied
  return false;

(晚了六年,我知道)

【讨论】:

晚了六年,但不支持高于8版本的节点:D【参考方案2】:

您可以通过https://github.com/thomas-alrek/node-php-password 做到这一点

var Password = require("node-php-password");

var options = 
    cost: 10,
    salt: "qwertyuiopasdfghjklzxc"
;
const hashedPassword = Password.hash(password, "PASSWORD_DEFAULT", options);

这将与 php 中的结果相同

crypt(password,'$2y$10$'.'qwertyuiopasdfghjklzxc'.'$')

【讨论】:

以上是关于如何在 NODE.JS 上模拟 php crypt()的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Node.js 上建立网站?

如何在 node.js 服务器上的 PHP Web 服务器和 Socket.io 之间创建握手?

Node.js JavaScript:在服务器上模拟按键(像宏一样)

你如何在 Node.js 中模拟 MySQL(没有 ORM)?

如何将 PHP 用户详细信息(会话)解析到 Node.js 服务器?

PHP 和 node.js 在同一台服务器上