如何在NodeJS中实现RabbitMQ的rabbit_password_hashing_sha256密码哈希
RabbitMQ SHA256 密码哈希NodeJS实现方案
问题背景
通过Docker使用RabbitMQ时,如需直接在definitions.json文件中更新配置,存储的用户密码需要使用rabbit_password_hashing_sha256哈希算法。已有可正常运行的Python实现,但无法用NodeJS Crypto库复现对应逻辑。
原有实现错误原因
- 第一次实现:误用PBKDF2密钥衍生算法,与RabbitMQ原生哈希逻辑不符,同时盐长度错误使用16字节,实际要求为4字节。
- 第二次实现:直接对二进制Buffer执行字符串拼接,触发隐式UTF-8转码导致二进制数据损坏,且哈希计算时未传入待加密的拼接内容,哈希值计算错误。
正确实现代码
const crypto = require('crypto'); // 从命令行获取明文密码 const password = process.argv[2]; // 生成4字节随机盐,对应Python实现的os.urandom(4) const salt = crypto.randomBytes(4); // 拼接盐与UTF-8编码的明文密码,全程使用Buffer操作避免二进制数据损坏 const tmp0 = Buffer.concat([salt, Buffer.from(password, 'utf8')]); // 对拼接结果计算SHA256哈希 const tmp1 = crypto.createHash('sha256').update(tmp0).digest(); // 拼接盐与哈希结果 const saltedHash = Buffer.concat([salt, tmp1]); // 转换为Base64编码输出 const passHash = saltedHash.toString('base64'); console.log(passHash);
逻辑验证
由于每次生成的盐是随机值,正常执行时输出结果会每次不同。若要验证与Python实现逻辑完全一致,可固定盐值测试:将盐生成代码替换为const salt = Buffer.from([0xb7, 0xbf, 0x89, 0x1b]),运行node 脚本文件名.js test,输出结果将与示例Python脚本输出的t7+JG/ovWbTd9lfrYrPXdFhNZLcO+y56x4z0d8S2OutE6XTE完全一致。
内容的提问来源于stack exchange,提问作者Balint Laszlo
相关产品推荐
相关产品推荐

