如何在Ubuntu Shell中生成与Node.js bcrypt.hash兼容的密码哈希
实现Node.js bcrypt哈希与openssl passwd命令输出兼容的方法
你在Node.js中用await bcrypt.hash("my-password", 12)生成的是标准bcrypt格式哈希,默认cost因子为12,Ubuntu下的openssl passwd可以直接生成完全兼容的同格式结果,操作方法如下:
基础生成命令
直接生成对应cost因子12的bcrypt哈希,命令如下:
# 直接传入明文密码生成(明文会出现在shell历史中,仅测试用) openssl passwd -bcrypt -rounds 12 "my-password"
如果要避免明文密码出现在命令行历史,使用stdin模式输入密码:
openssl passwd -bcrypt -rounds 12 -stdin # 执行后输入你的密码回车即可,输入过程不会回显
与现有Node.js生成的哈希对齐验证
如果你需要生成和某条现有bcrypt哈希完全一致的结果,需要提取现有哈希中的盐值传入命令:
标准bcrypt哈希格式为
$2b$[cost]$[22位盐][31位哈希值],例如$2b$12$EixZaYb6K2n1PnVqj2uW/eW8M7oX9eK4tZ8X7cV9b6N5M4K3J2H1的盐值为EixZaYb6K2n1PnVqj2uW/e
指定盐值的生成命令:
openssl passwd -bcrypt -rounds 12 -salt 「你提取的22位盐值」 "my-password"
执行后输出的哈希值和Node.jsbcrypt.hash方法用相同盐、相同cost生成的结果完全一致,可以直接用bcrypt.compare方法验证通过。
兼容性说明
- openssl生成的bcrypt哈希默认使用
$2b前缀,和Node.js bcrypt库的默认输出前缀完全一致,和旧版$2a前缀的bcrypt哈希也可以互通验证,不会影响密码匹配 - Ubuntu 20.04及以上LTS版本的默认openssl包已内置bcrypt支持,无需额外安装依赖,更低版本如果执行报错可以先升级openssl到1.1.0及以上版本
内容的提问来源于stack exchange,提问作者SexyMF
相关产品推荐
相关产品推荐

