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

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

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

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

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

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

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
 雜湊函數 & 訊息鑑別碼 |
| --- |
|  |
| 
* 列表
* 比较
* 已知攻击

 |
|  |
| 常用函数 | 
* MD5
* SHA-1
* SHA-2
* SHA-3/Keccak
* BLAKE2

 |
|  |
| SHA-3入围（英语：） | 
* BLAKE
* Grøstl
* JH（英语：）
* Skein（英语：）
* Keccak（胜出）

 |
|  |
| 其他函数 | 
* ECOH（英语：）
* FSB（英语：）
* GOST（英语：）
* HAS-160（英语：）
* HAVAL（英语：）
* Kupyna（英语：）
* LM hash（英语：）
* MD2（英语：）
* MD4
* MD6
* MDC-2（英语：）
* N-Hash（英语：）
* RIPEMD
* RadioGatún（英语：）
* SWIFFT（英语：）
* SipHash（英语：）
* Snefru（英语：）
* Streebog（英语：）
* Tiger（英语：）
* VSH（英语：）
* WHIRLPOOL（英语：）
* SM3
* X11

 |
|  |
| 密码散列/密钥延伸函数 | 
* Argon2
* Balloon
* bcrypt
* Catena（英语：）
* crypt(3)（英语：） (DES)
* LM散列（英语：）
* Lyra2
* Makwa（英语：）
* PBKDF2
* scrypt
* yescrypt

 |
|  |
| 通用密钥派生函数 | 
* HKDF
* KDF1/KDF2

 |
|  |
| MAC算法 | 
* DAA（英语：）
* CBC-MAC（英语：）
* HMAC
* OMAC（英语：）/CMAC（英语：）
* PMAC（英语：）
* VMAC（英语：）
* UMAC（英语：）
* Poly1305

 |
|  |
| 认证加密模式 | 
* CCM（英语：）
* CWC（英语：）
* EAX（英语：）
* GCM
* IAPM（英语：）
* OCB（英语：）

 |
|  |
| 攻击 | 
* 碰撞攻击（英语：）
* 原像攻击
* 生日攻击
* 穷举攻击/蛮力攻击
* 彩虹表
* 旁路攻击
* 长度扩展攻击

 |
|  |
| 设计 | 
* 雪崩效应
* 碰撞
* 默克尔-达姆加德结构（英语：）

 |
|  |
| 标准化 | 
* CRYPTREC（英语：）
* NESSIE（英语：）
* NIST散列函数竞赛（英语：）

 |
|  |
| 实际应用 | 
* 盐
* 密钥延伸
* 信息鉴定

 |

 |

 |
|  |
| 

| * 
* 论
* 编
密码学 |
| --- |
|  |
| 
* 密码学历史
* 密码分析
* 密碼學主題列表

 |
|  |
| 
* 對稱密鑰加密
* 分组密码
* 流密码
* 公开密钥加密
* 密碼雜湊函數
* 訊息鑑別碼
* 随机数
* 隐写术

 |
|  |
| 
* 分类 分类
* 主题 主题
* 专题 专题

 |

 |

 |