密钥延伸

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

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

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

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

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

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

Y