密钥延伸

维基百科,自由的百科全书

密码学中,密钥延伸(英語:Key stretching)技术用以使弱密钥(通常是用户口令密码短语)更安全;通过增加尝试每个可能密钥所需的时间和空间(如果可能)资源,有效阻止蛮力攻击(暴力破解)。人们填写的口令或密码短语经常太短,或足够可预测,因而有密码破解的风险。密钥延伸使得这类攻击难以进行,原理是使得测试每个密码的基本步骤更加复杂。因为一个密钥生成函数必须是确定的,所以弱密码总是产生相同的延伸后的密钥(称为增强密钥),这种密钥延伸不改变密钥空间(key-space)的熵,仅使计算增强密钥的方法更复杂。对不加盐密钥延伸的攻击是存在的,称作彩虹表。对密钥加盐是指在弱密钥后追加一个长的随机串,使得预先计算好的散列值不再可用。

密钥延伸技术总体上是这样进行的:输入初始密钥到生成增强密钥的算法。得到的增强密钥应具有足够长度(比如128位),以使其几乎不可能被暴力破解。整个使用的算法应当是安全的,已知不存在用更少处理器资源和内存(相对于使用上述算法本身)即可算出增强密钥的捷径。

密钥延伸技术留给攻击者两个选项:或者尝试每种可能的增强密钥组合(只要增强密钥足够长,这几乎不可能达成),或者尝试每个可能的初始密钥。对于后者,如果初始密钥是口令或者密码短语,那么攻击者首先会尝试字典中的每个词或者每个常用密码,然后对更长的口令尝试每种字符组合。密钥延伸不杜绝这种方法,但攻击者的每次尝试将不得不花费更多资源(时间和使用的内存空间),于是这种方法也很容易几近于不可行。

攻击者如果使用和用户同等级的硬件,每次猜测尝试将会花费和用户差不多一样长的时间(比如一秒钟)。即便攻击者有比用户更强大的计算资源,密钥延伸仍然会拖慢攻击者的速度,同时又不明显影响合法用户感知到的系统可用性,因为用户在输入密码后计算机只需计算一次增强密钥,而攻击者攻击时的每次猜测都必须计算一次。

有若干方式可以进行密钥延伸。一种是循环重复应用密码散列函数块加密方法,另一种是使用需要大量内存的密码散列函数。

加盐经常与密钥延伸一同使用,防止攻击者进行特定的空间换时间/时间换空间的攻击(经常是空间换时间,类似于彩虹表)。