我使用的是AES-CBC-256与PKCS#7兼容的填充。我已经有来自“密码安全随机数生成器”的32个字节。在这种情况下,使用PBKDF2派生最终用于加密/解密的密钥有意义吗?
我的场景是,我需要将旧代码移植到一个新堆栈中。这一切都很好,但我还没有实现密钥派生。在旧库中,输入是32个随机字节+32个字节盐(所有输入都是使用https://www.cryptopp.com/docs/ref/class_自动_种籽_随机性_pool.html为初始随机字节生成的),它被视为“密码”,使用65536次迭代的PBKDF2来派生最终密钥。
我认为PBKDF2应该从短用户密码中派生出更大的秘密,但在这里,它用于从2* 32字节块导出32字节的秘密。
我从被认为是密码安全的随机数发生器中得到了我的32个字节,这意味着我已经有足够的熵了。我需要得到钥匙吗?是否增加了安全性?
发布于 2020-05-12 09:23:41
你是对的。除非软件正在做一些非常奇怪的事情,这在阅读代码和文档时应该是非常明显的,而且我无法想象它会是什么,盐的生成和PBKDF2的应用是不必要的。
如果您有来自密码安全随机生成器的32个字节,则可以使用这32个字节作为AES-256密钥。CSRNG是最好的:它是一致的随机和不可猜测的。
您将使用一个(“普通”,非拉伸) 密钥推导来确定地从某些输入中获得一个键,这些输入不一定是均匀随机的,但具有足够的熵。一个典型的需要密钥推导步骤的例子是Diffie-Hellman 密钥交换算法的输出:它需要确定性,以便双方计算相同的密钥,而且您不能直接使用DH计算的输出,因为它是一个具有某些数学性质的数字,因此它不是均匀分布的。另一种需要密钥派生的情况是,当您有一些长度有限的秘密材料(但足够大,以至于无法通过蛮力找到它:至少128位)时,您需要构造总长度大于秘密材料的多个密钥。
CSRNG以熵源作为输入,并应用伪随机计算(CSPRNG:加密安全伪随机数生成器)产生随机输出。密钥推导函数(KDF)接受输入,并应用伪随机计算来产生伪随机输出。CSPRNG和密钥派生函数具有相当相似的安全属性:只要对手没有看到秘密输入,即使对手看到部分输出,他们也找不出输出中没有给他们的部分。把他们锁起来是没有意义的。将它们与第三种东西结合起来是有意义的,例如使用CSRNG生成公共盐,使用KDF将此公共盐与密钥组合以生成另一个密钥,或者使用KDF为CSRNG生成种子,然后该种子将被不再访问原始KDF的子系统使用。
当输入具有低熵时,拉伸密钥派生函数(如PBKDF2)非常有用。“低熵”的意思是输入是可信的猜测通过蛮力。CSRNG输出的长度具有最大熵,128位(16字节)足以使其完全超出蛮力猜测的范围。(未来,量子密码分析可能会将bar提高到256位。)键伸展用于足够短的秘密,以便于记忆,通常是密码或密码。您需要对CSRNG的输出应用键延伸的唯一原因是,如果该输出被故意保持简短以作为密码存储(大概是以一种适合人类编码的形式,例如一串可打印字符或一个单词列表)。
从CSRNG获取64个字节并通过PBKDF2传递它们没有任何意义。只需使用CSRNG输出作为键。使用PBKDF2并不是直接的安全风险,但它损害了性能,增加了攻击面。请注意,如果当前的软件这样做,它表明作者不明白他们在做什么,可能还有其他问题,实际上是安全缺陷。
https://crypto.stackexchange.com/questions/80625
复制相似问题