【问题标题】:How to mimic php crypt() on NODE.JS如何在 NODE.JS 上模拟 php crypt()
【发布时间】:2013-02-19 22:44:52
【问题描述】:

请帮助 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() 是单向字符串散列,不应该被破译,所以我猜密码不是正确的工具。

标签: php javascript node.js encryption des


【解决方案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'.'$')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-08
    • 2018-09-05
    • 2021-11-02
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    相关资源
    最近更新 更多