首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python pbkdf2_sha256.verify的NodeJS实现

Python pbkdf2_sha256.verify的NodeJS实现
EN

Stack Overflow用户
提问于 2018-07-31 21:00:05
回答 4查看 1.1K关注 0票数 4

我必须将这段Python代码转换成NodeJS:

代码语言:javascript
复制
from passlib.hash import pbkdf2_sha256
pbkdf2_sha256.verify('12345678', '$pbkdf2-sha256$2000$8R7jHOOcs7YWImRM6V1LqQ$CIdNv8YlLlCZfeFJihZs7eQxBsauvVfV05v07Ca2Yzg')
>> True

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

我正在寻找validatePassword函数在Node中的正确实现,它将通过这个积极的实现测试:

代码语言:javascript
复制
validatePassword('12345678', '$pbkdf2-sha256$2000$8R7jHOOcs7YWImRM6V1LqQ$CIdNv8YlLlCZfeFJihZs7eQxBsauvVfV05v07Ca2Yzg')
>> true

下面是passlib.hash.pbkdf2_sha256的documentation及其默认参数值。

我尝试用上面Python代码中的数据来回答here中的问题,但是解决方案没有通过测试。

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

提前谢谢你。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-02 00:37:31

这将会起作用:

代码语言:javascript
复制
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, '.')
}
票数 4
EN

Stack Overflow用户

发布于 2020-07-25 04:35:18

我不能让这个和这里的其他答案一起工作,但它们确实引导我朝着正确的方向前进。

这就是我的落脚点:

代码语言:javascript
复制
// eslint-2017
import crypto from 'crypto';
const encode = (password, { algorithm, salt, iterations }) => {
    const hash = crypto.pbkdf2Sync(password, salt, iterations, 32, 'sha256');
    return `${algorithm}$${iterations}$${salt}$${hash.toString('base64')}`;
};
const decode = (encoded) => {
    const [algorithm, iterations, salt, hash] = encoded.split('$');
    return {
        algorithm,
        hash,
        iterations: parseInt(iterations, 10),
        salt,
    };
};
const verify = (password, encoded) => {
    const decoded = decode(encoded);
    const encodedPassword = encode(password, decoded);
    return encoded === encodedPassword;
};
// <algorithm>$<iterations>$<salt>$<hash>
const encoded = 'pbkdf2_sha256$120000$bOqAASYKo3vj$BEBZfntlMJJDpgkAb81LGgdzuO35iqpig0CfJPU4TbU=';
const password = '12345678';
console.info(verify(password, encoded));

我知道这是一个古老的帖子,但它是谷歌上排名靠前的结果之一,所以我想我会帮助那些在2020年遇到这个问题的人。

票数 0
EN

Stack Overflow用户

发布于 2020-11-17 20:57:39

这对基于node-django-hasher的我是有效的(我没有使用它,因为依赖于node-gyp)

代码语言:javascript
复制
function validatePassword(plain, hashed) {
  const parts = hashed.split('$');
  const salt = parts[2];
  const iterations = parseInt(parts[1]);
  const keylen = 32;
  const digest = parts[0].split('_')[1];
  const value = parts[3];
  const derivedKey = crypto.pbkdf2Sync(plain, salt, iterations, keylen, digest);
  return value === Buffer.from(derivedKey, 'binary').toString('base64');
}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51613990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档