我正在尝试使用明文密码并对其进行散列,以便与存储在FreeBSD/etc/ hashes . password中的密码散列进行比较。我的目标是拥有一个node.js程序,它能够使用现有的帐户凭据对master.passwd数据库进行身份验证。
我已经建立了一个名为FreeBSD的test1帐户。我给了它一个密码“密码”。查看master.password,我在密码字段中看到了以下内容:
$6$nEIifU2XZ9VDx3l5$RUW0Udy60Hon9OsoTAz8DcH0uvZ4E3p5CXFScrC694EF1Cpkf8/5GUtC750NZXnMFYZsMlBZE52INFlBUvWMb0
我的理解是,$字符充当三个字段的分隔符:
我试图在Node.js中复制哈希算法,如下所示:
const crypto = require("crypto");
let passwordPlain = "password"
let salt64 = "nEIifU2XZ9VDx3l5"
let salt = Buffer.from(salt64, "base64");
let passwordHashed = crypto.scryptSync(salt, passwordPlain, 64);
let passwordHashed64 = passwordHashed.toString('base64');
console.log(`$6$${salt64}$${passwordHashed64}`);我原本希望看到我的纯文本密码“密码”与salt混搭,并显示出来与master.password中的内容相匹配。我得到的完全不同。
$6$nEIifU2XZ9VDx3l5$Y9/0OCikTExQlo0lLp5FVK6DuANVx7BOXZ/spLvTyFvJstUVpJGeanqE+U6Uca63PagSiGNDfMbg35MpTUT/dQ==
我尝试过在没有base64解码的情况下传递盐分。我试过把$分隔符作为盐的一部分。我甚至尝试过Hmac而不是氪星。毫无办法。
我开始怀疑它是否不是base64编码的。暗示它的文档相当过时,只提到了MD5散列。此外,我希望至少在我的master.passwd中看到一些同样的符号填充master.passwd,而我没有。最后,我在FreeBSD网站上看到了一个例子,上面显示了一个带有点的密码散列,据我所知,这不是base64字符集的一部分。(只有字母、数字和+ /)
我也在考虑Node.js scrypt()和FreeBSD crypt()。这是我能找到的最接近的东西,当我使用默认的键长度64并删除两个填充字符时,base64编码长度与master.passwd中的长度非常匹配。但是,哈希还是有很大的不同。
我希望有人能揭示一些事情,因为我已经到了我的互联网搜索技能的极限在这一项。
链接到重新缓存的页面:
发布于 2020-08-10 10:41:24
https://github.com/mvo5/sha512crypt-node是基于the 512的加密实现的NodeJS实现.以下代码提供了所需的哈希:
const crypt = require('sha512crypt-node')
const hash = crypt.b64_sha512crypt('password', 'nEIifU2XZ9VDx3l5')
console.log( hash ) // $6$nEIifU2XZ9VDx3l5$RUW0Udy60Hon9OsoTAz8DcH0uvZ4E3p5CXFScrC694EF1Cpkf8/5GUtC750NZXnMFYZsMlBZE52INFlBUvWMb0进一步的使用示例可以找到这里。
SHA512密码节点和SHA512部分FreeBSD实现的密码都是基于算法描述的这里,也见[1][2]。crypto.scrypt (或crypto.scryptSync)来自NodeJS是基于所描述的这里算法,也见[3][4]。最终,这些算法是不同的,因此不能期望匹配散列。
本文这里对各种算法进行了比较,包括加密算法和加密的SHA512部分,您应该会感兴趣,特别是在安全性方面。
https://stackoverflow.com/questions/63334116
复制相似问题