You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:15:01