我在浏览器中使用PBKDF2 (不能使用bcrypt,用户的密码可能超过72字节,或者不管密码是多少)。PBKDF2运行在一个webworker中,类似于
const key = PBKDF2_HMAC_SHA512.bytes(passphrase, salt, Math.pow(2,17), 64)此密钥用于加密要存储在用户本地存储中的数据。现在我想知道,既然我已经在使用一个网络工作者,为什么不使用多个呢?难道我就不能把它化掉吗?我能不能不做类似的事情(简化,实际上每个键都是在一个单独的web工作者中生成的)
const key1 = PBKDF2_HMAC_SHA512.bytes(passphrase, salt1, Math.pow(2,17), 16)
const key2 = PBKDF2_HMAC_SHA512.bytes(passphrase, salt2, Math.pow(2,17), 16)
const key3 = PBKDF2_HMAC_SHA512.bytes(passphrase, salt3, Math.pow(2,17), 16)
const key4 = PBKDF2_HMAC_SHA512.bytes(passphrase, salt4, Math.pow(2,17), 16)
const key5 = new Uint8Array(64)
key5.set(key1)
key5.set(key2, 16)
key5.set(key3, 32)
key5.set(key4, 48)
const key = SHA_512.bytes(key5)这不是安全的4倍吗?或者更重要的是,我能不能把每个pbkdf2实例的次数减少一半,但最终仍然得到2倍的安全性?如果我错了,有人能为我指出一个更快/更安全的可并行的kdf的正确方向吗?
发布于 2018-05-07 10:10:30
正如森林所说,并行线程的安全效果很低,Argon2将是一个更好的选择。
Argon2也使用内建并行,这可能会让人感到困惑,但它以一种更有效的方式使用它。
要使密钥派生函数内存难以实现,通常需要构建一个大的伪随机向量.访问向量使得使用自定义硬件非常昂贵,甚至不可能(这有点简化)。所有内存硬密钥派生函数的问题是,创建这么大的向量也需要大量时间。如果您想要运行具有大量内存的Scrypt、Catena或Lyra2,则需要大量的时间来创建向量。因此,即使有大量可用内存,您也不能将其用于密钥派生,因为时间问题。
Argon团队聪明的想法是使用并行性来创建向量,而不是键派生函数的并行实例。由于有了这个想法,Argon2可以在有限的时间内很难记忆。我想这至少是一个原因,为什么Argon2是密码哈希竞赛的赢家。
简而言之:并行性提高内存填充率是有效的,但对于增加时间量却不是。
https://crypto.stackexchange.com/questions/58924
复制相似问题