代码之家  ›  专栏  ›  技术社区  ›  Alexander

Python的pbkdf2_sha256.verify的NodeJS实现

  •  2
  • Alexander  · 技术社区  · 7 年前

    我必须将这个Python代码转换为NodeJS:

    from passlib.hash import pbkdf2_sha256
    pbkdf2_sha256.verify('12345678', '$pbkdf2-sha256$2000$8R7jHOOcs7YWImRM6V1LqQ$CIdNv8YlLlCZfeFJihZs7eQxBsauvVfV05v07Ca2Yzg')
    >> True
    

    上面的代码是整个代码,即没有其他参数/设置(只需运行 pip install passlib 在运行它以安装 passlib 包装)。

    我正在寻找正确的 validatePassword 将通过此肯定实现测试的节点中的函数:

    validatePassword('12345678', '$pbkdf2-sha256$2000$8R7jHOOcs7YWImRM6V1LqQ$CIdNv8YlLlCZfeFJihZs7eQxBsauvVfV05v07Ca2Yzg')
    >> true
    

    这是 documentation 具有其默认参数值的passlib.hash.pbkdf2Өu sha256。

    我试着从 here 上面来自Python代码的数据,但是这个解决方案没有通过测试。

    我希望能在这个实现中得到一些帮助(最好使用内置的NodeJS crypto 包装)。

    提前谢谢你。

    2 回复  |  直到 7 年前
        1
  •  3
  •   shaylevi2    7 年前

    这将起作用:

    const crypto = require('crypto')
    function validatePassword(secret, format) {
        let parts = format.split('$')
        return parts[4] == crypto.pbkdf2Sync(secret, Buffer.from(parts[3].replace(/\./g, '+') + '='.repeat(parts[3].length % 3), 'base64'),
            +parts[2], 32, parts[1].split('-')[1]).toString('base64').replace(/=/g, '').replace(/\+/g, '.')
    }
    
        2
  •  0
  •   Alexandru Olaru    7 年前

    你可以使用 crypto.pbkdf2 本机node.js api

    const crypto = require('crypto');
    crypto.pbkdf2('secret', 'salt', 100000, 64, 'sha256', (err, derivedKey) => {
      if (err) throw err;
      console.log(derivedKey.toString('hex'));  // '3745e48...08d59ae'
    });
    

    它具有以下api:

    • password <string>
    • salt <string>
    • iterations <number>
    • keylen <number>
    • digest <string>
    • callback <Function>
      • err <Error>
      • derivedKey <Buffer>

    因此,您需要使用输入变量来获得python中的预期结果。

    另一种方法

    我使用了输入变量,但没有多少成功,我得到的最简单的想法是让python脚本验证密码并用 child_process.spawn 在node.js中。