这个场景是这样的:为了不同的目的,我需要两个密钥(加密+加密,加密+ mac,等等)。因为重用相同的密钥不是很好的实践,所以我希望这两个键是独立的。但是记住两个不同的键是很麻烦的(请不要质疑这个问题),所以我认为应该有一些方法从一个普通的主键生成这些键。
我能找到的最接近这项工作的密码工具是一个KDF。然而,KDF通常作为额外的输入: salt。我应该随机生成并记住一个salt,还是简单地使用一个哈希函数(如SHA512 )并将其输出分成2个键?
我认为在这种情况下,不需要担心从派生密钥中恢复主键的可能性,因为派生密钥的重要性不亚于主键。派生密钥的危害与主键的危害一样严重。相反,重点是两个派生密钥之间的独立性,因为至少有一些加密和mac方案,在一起使用时,如果密钥不是独立的,就会完全崩溃。
发布于 2018-07-13 22:45:01
发布于 2018-07-14 01:03:41
记住一把钥匙很麻烦,更别提两把了。加密密钥应该由大约128位组成,这样才是安全的。记住密码或密码是足够困难的。密码不是秘密/对称密钥,因为它不包含随机位。
基本上有两种类型的KDF。一种是使用密码作为主要输入材料的KDF,称为PBKDF:一个基于密码的密钥派生函数。第二种方法是将键作为主输入,称为KBKDF:基于键的密钥派生函数。
PBKDF和KBKDF都可能需要盐,但盐对PBKDF来说更重要。这是因为,否则两个相同密码的输出可能很容易识别。此外,没有盐,彩虹表可以用来尝试和找到密码。密钥的强度也会减弱,特别是多次使用时,但密钥的初始强度要比常规密码高得多,因此,对于192位或更高的密钥大小较大的密钥,削弱强度将不那么明显或不适用。
KBKDF也可能需要盐,但它主要用于简化KBKDF的证明。如果输入键确实包含足够的熵,那么没有它的KDF应该是安全的。香港发展基金可以接受一个盐作为输入,香港发展基金标准包含一部分关于盐如何帮助确保香港发展基金的输出-提取在第3.1章。
要从密码中派生出两个密钥,PBKDF和KDF的使用都是最不易碎的(我的意思是:如果PBKDF或KBKDF有问题,则最不可能中断)。
你会得到:
这样,您只需要一个salt,就可以对密码执行密钥增强,并且密钥K_1和K_2是独立的。密码可以是任何实际大小。当然,它仍然必须是相对强大的,否则它可能是野蛮的,强迫的,或发现使用(增强的)字典攻击。
如果您想使用两个现代实现,您可以使用一个Argon2变体作为PBKDF和HKDF或HKDF-展开为KBKDF。
请注意,\mathit{work}参数可能包括要执行的CPU工作的元素、并行性以及函数的内存硬度。\mathit{label}通常是名为\mathit{OtherInfo}或仅\mathit{info}的结构的一部分,该结构还可能包含标识或分隔输出键的其他数据。每个标准都可以使用稍微不同的参数名称和符号。
原则上,如果您真的可以记住一个键,那么您可以只使用KBKDF,但这非常麻烦:
17a2ae1904debd903e090d5c7fb0a0e3是显示为32十六进制的128位随机密钥。
https://crypto.stackexchange.com/questions/60775
复制相似问题