此條目介紹的是密码学中的盐。关于其他用法，请见「**盐**」。

**盐**（Salt），在密码学中，是指在散列之前将散列内容（例如：密码）的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为「加盐」。其作用是让加盐後的散列结果和没有加盐的结果不相同，在不同的应用情景中，这个处理可以增加额外的安全性。

在大部份情况，盐是不需要保密的。盐可以是随机产生的字符串，其插入的位置可以也是随意而定。如果这个散列结果在将来需要进行验证（例如：验证用户输入的密码），则需要将已使用的盐记录下来。

安全因素
----

通常情况下，当字段经过散列处理（如SHA-1），会生成一段散列值，而散列后的值一般是无法通过特定算法得到原始字段的。但是某些情况，比如一个大型的彩虹表，通过在表中搜索该SHA-1值，很有可能在极短的时间内找到该散列值对应的真实字段内容。

加盐后的散列值，可以极大的降低由于用户数据被盗而带来的密码泄漏风险，即使通过彩虹表寻找到了散列后的数值所对应的原始内容，但是由于经过了加盐，插入的字符串扰乱了真正的密码，使得获得真实密码的概率大大降低。

实现原理
----

加盐的实现过程通常是在需要散列的字段的特定位置增加特定的字符，打乱原始的字串，使其生成的散列结果产生变化。比如，用户使用了一个密码：

```
x7faqgjw
```

经过SHA散列后，可以得出结果：

```
58ecbf2b3136ceda7fddfd986ba8bd8d59b2d73779691e839f3f176ce2c04b84
```

但是由于用户密码位数不足，短密码的散列结果很容易被彩虹表破解，因此，在用户的密码末尾添加特定字串（绿色字体为加盐的字段）：

```
x7faqgjwabcdefghijklmnopqrstuvwxyz
```

因此，加盐后的密码位数更长了，散列的结果也发生了变化：

```
7b5001a5a8bcdcfa1b64d41f6339cfa7a5c0eca04cca6ff6a6c1d6aad17794cc
```

以上就是加盐过程的简单描述，在实际使用过程中，还需要通过特定位数插入、倒序或多种方法对原始密码进行固定的加盐处理，使得散列的结果更加不容易被破解或轻易得到原始密码，比如（绿色字体为加盐字串）：

```
x7afabqgcjw
```

代码样本
----

### PHP

```
//这是一个简单的、在输入内容之後加入"WIKIPEDIA"并进行散列的PHP代码。
<?php
function hash($a) {
    $salt="WIKIPEDIA"; //定义一个加盐字段(WIKIPEDIA)，一旦设定并使用，将不可更动。
    $b=$a.$salt; //把密码和加盐字段连接。
    $b=sha($b); //执行MD5散列。
    return $b; //返回散列。
}
?>

```

参考文献
----

* . : 98. ISBN 978-0596006563.

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

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

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

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

 |
|  |
| 常用函数 | 
* 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散列函数竞赛（英语：）

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

 |

 |

 |
|  |
| 

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

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

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

 |

 |

 |