是否可以从bcrypt迁移到crypto?

问题描述 投票:0回答:1

拥有多个 ACL,其中包含生成的用户记录和密码。

bcrypt.hashSync(request.password, bcrypt.genSaltSync(8))

我们可以比较同步这些密码,而不需要使用compareSync()方法生成盐。

bcrypt.compareSync(request.password, ACL.password)

我知道 bcrypt 哈希值包含盐,因此compareSync方法不需要销售来将哈希值与密码[字符串]进行比较。

使用 crypt 生成盐并对密码进行哈希处理,我既无法将 pbkdf2Sync 生成的哈希值与 scryptSync 方法进行比较,也无法与 bcrypt 哈希值进行比较。

let cryptoSalt = crypto.randomBytes(8).toString('base64')

let pbkdf2Hash = crypto.pbkdf2Sync(request.password, cryptoSalt, 1000, 44, 'sha512').toString('base64')

let scryptHash = crypto.scryptSync(request.password, cryptoSalt, 44).toString('base64')

有什么方法可以使用 crypto 生成可以与使用 bcrypt 生成的哈希进行比较的哈希吗?

是否可以使用相同的盐从 pbkdf2Sync 和 scryptSync 创建相同的 [base64] 哈希?

node.js hash cryptography passwords bcrypt
1个回答
0
投票

bcrypt、PBKDF2 和 scrypt 都是密码哈希值,但它们的工作方式都不同,并且一种格式的哈希值无法转换为另一种格式。这是因为它们实际上都是单向哈希,内部工作方式不同。

此外,一般来说,您应该避免使用 PBKDF2,除非您需要符合 FIPS 合规性。原因是 scrypt 和 Argon2 是内存难哈希,这意味着它们使用一定量的内存来使其在 GPU 上更难破解,这很好。巧合的是,bcrypt 在 GPU 上也很难破解。 PBKDF2 在 GPU 上的速度大大加快,这很糟糕,因此应该避免使用。

但是,您

可以设置代码来处理两者之间的迁移。首先,确保您的 bcrypt 哈希值都使用一些固定前缀。通常这类似于 $2b$

,但无论你做什么,都要确保它是独一无二的。

然后,当有人登录时,如果哈希使用 bcrypt,请验证密码,然后使用 scrypt(或 Argon2 或其他)重新哈希它,它也应该有一个唯一的前缀,并将新哈希写入数据库老的。如果用户已经拥有 scrypt 哈希,则无需执行任何操作。

现在,除非您强制所有用户经常登录,否则某些用户将继续使用旧的 bcrypt,您只能接受这一点。不过,大多数用户会及时更新,从而提高安全性。

© www.soinside.com 2019 - 2024. All rights reserved.