如何在 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 服务器上的 PHP Web 服务器和 Socket.io 之间创建握手?
Node.js JavaScript:在服务器上模拟按键(像宏一样)
你如何在 Node.js 中模拟 MySQL(没有 ORM)?