Oracle Password Verifier 详解
## 一、Password Verifier 概述
**Password Verifier(密码验证器)** 是 Oracle 数据库中用于存储和验证用户密码的核心机制。它本质上是一种经过单向哈希处理的密码表示形式,Oracle 数据库不会以明文形式存储用户密码,而是将用户输入的密码通过特定的哈希算法处理后,生成对应的 Verifier 并存储在数据字典中。当用户尝试登录时,数据库将用户输入的密码经过相同的算法处理后,与存储的 Verifier 进行比对,从而完成身份验证。
Oracle 数据库从早期版本到现代版本,Password Verifier 经历了多次演进,先后出现了 **10G、11G 和 12C** 三个主要版本。不同版本的 Verifier 采用了不同的哈希算法和安全机制,反映了数据库安全技术的不断发展。
---
## 二、三种 Password Verifier 版本详解
### 1. 10G 版本 Verifier
10G 版本的 Password Verifier 是 Oracle 数据库早期使用的密码验证机制。它的生成过程相对简单:首先将用户名和密码转换为大写形式(不区分大小写),然后进行拼接,最后使用 MD5 算法进行哈希处理。
**特点:**
- **不区分大小写**:用户名和密码在哈希前都被转换为大写,因此 `Password` 和 `password` 被视为相同的密码。
- **基于 MD5 算法**:MD5 是一种较早的哈希算法,虽然计算速度快,但安全性相对较低,容易受到彩虹表攻击和暴力破解。
- **无 Salt 机制**:10G 版本的 Verifier 在哈希过程中没有引入随机 Salt 值,相同密码在不同用户或不同数据库中生成的哈希值完全相同,进一步降低了安全性。
- **存储位置**:Verifier 存储在 `SYS.USER$` 表的 `PASSWORD` 列中。
由于上述安全缺陷,Oracle 官方强烈建议不再使用 10G 版本的 Verifier。
### 2. 11G 版本 Verifier
11G 版本的 Password Verifier 在 10G 的基础上进行了显著的安全增强,引入了 Salt 机制和更复杂的哈希算法。
**生成过程:**
1. 将密码转换为 UTF-8 编码的字节数组(区分大小写)。
2. 生成一个 10 字节的随机 Salt 值。
3. 将 Salt 与密码进行拼接。
4. 使用基于 SHA-1 的哈希算法(HMAC-SHA-1)进行 4096 轮迭代哈希处理。
5. 最终生成一个包含 Salt 和哈希值的复合字符串。
**特点:**
- **区分大小写**:与 10G 不同,11G 版本的 Verifier 对密码的大小写敏感。
- **引入 Salt 机制**:每个密码都附带一个随机 Salt 值,即使两个用户使用相同的密码,生成的 Verifier 也完全不同,有效抵御彩虹表攻击。
- **迭代哈希**:4096 轮迭代哈希增加了暴力破解的计算成本。
- **存储位置**:Verifier 存储在 `SYS.USER$` 表的 `SPARE4` 列中,格式为 `S:HASH_VALUE:SALT`。
11G 版本的 Verifier 在安全性上有了质的飞跃,成为 Oracle 11g 及后续版本中的标准密码验证机制。
### 3. 12C 版本 Verifier
12C 版本的 Password Verifier 是 Oracle 数据库目前最安全的密码验证机制,采用了现代密码学标准。
**生成过程:**
1. 将密码转换为 UTF-8 编码的字节数组。
2. 生成一个 16 字节的随机 Salt 值。
3. 使用基于 PBKDF2(Password-Based Key Derivation Function 2)的算法。
4. 采用 SHA-512 作为底层哈希算法,进行 126,000 轮迭代。
5. 最终生成一个高度安全的复合 Verifier。
**特点:**
- **区分大小写**:与 11G 一致,密码大小写敏感。
- **更强的 Salt**:16 字节的 Salt 值提供了更大的随机空间。
- **SHA-512 算法**:相比 SHA-1,SHA-512 具有更长的输出长度和更高的抗碰撞性。
- **高迭代次数**:126,000 轮迭代大幅提升了暴力破解的难度。
- **存储位置**:Verifier 存储在 `SYS.USER$` 表的 `SPARE4` 列中,格式为 `T:HASH_VALUE:SALT`。
12C 版本的 Verifier 符合现代密码安全标准,是 Oracle 推荐使用的密码验证机制。
---
## 三、SQLNET.ALLOWED_LOGON_VERSION_SERVER 参数
`SQLNET.ALLOWED_LOGON_VERSION_SERVER` 是控制数据库服务器端密码验证行为的关键参数,它决定了数据库在创建新用户或修改密码时生成哪些版本的 Verifier,同时也影响客户端连接时允许的最低密码版本。
**参数值与生成 Verifier 的对应关系:**
| 参数值 | 生成的 Password Verifier 版本 | 说明 |
|--------|---------------------------|------|
| `12a` | 仅 12C | 最高安全级别,仅支持 12C Verifier |
| `12` | 11G、12C | Oracle 19c 默认值,兼顾兼容性和安全性 |
| `11` | 10G、11G、12C | 向后兼容,支持所有版本 |
| `10` | 10G、11G、12C | 向后兼容,支持所有版本 |
| `9`、`8` | 10G、11G、12C | 向后兼容,支持所有版本 |
在 Oracle 19c 中,该参数的默认值为 `12`。这意味着当使用 DEFAULT Profile 创建新用户或修改密码时,Oracle 会自动生成 **11G 和 12C** 两个版本的 Verifier,而不会生成 10G 版本。这种设计既保证了与较新客户端的兼容性(12C),又保留了对部分旧客户端的支持(11G),同时避免了使用安全性较差的 10G Verifier。
---
## 四、Password Verifier 的查看与管理
### 查看用户的 Password Verifier
可以通过查询 `SYS.USER$` 表来查看用户的 Password Verifier 信息:
```sql
SELECT username, password, spare4
FROM sys.user$
WHERE username = 'YOUR_USER';
```
- `PASSWORD` 列:存储 10G 版本的 Verifier(如果存在)。
- `SPARE4` 列:存储 11G 和 12C 版本的 Verifier,格式如下:
- `S:HASH:SALT` — 11G 版本
- `T:HASH:SALT` — 12C 版本
### 查看数据库中所有用户的密码版本
```sql
SELECT username, password_versions
FROM dba_users;
```
`PASSWORD_VERSIONS` 列会显示该用户当前拥有的 Verifier 版本,例如 `11G 12C`。
---
## 五、安全建议与最佳实践
1. **避免使用 10G Verifier**:由于 10G 版本存在严重的安全缺陷,建议将 `SQLNET.ALLOWED_LOGON_VERSION_SERVER` 设置为 `12` 或更高,避免生成 10G Verifier。
2. **逐步升级到 12C Verifier**:对于仍在使用 11G Verifier 的用户,建议在密码到期或主动修改密码时,通过设置参数为 `12a` 强制仅生成 12C Verifier。
3. **定期审计密码版本**:定期执行以下查询,识别仍在使用低版本 Verifier 的用户:
```sql
SELECT username, password_versions
FROM dba_users
WHERE password_versions LIKE '%10G%';
```
4. **配合 Profile 密码策略**:通过 Oracle Profile 功能设置密码复杂度、过期时间、重用限制等策略,与 Password Verifier 机制协同提升整体安全性。
5. **监控登录行为**:结合数据库审计功能,监控异常登录尝试,及时发现潜在的密码破解攻击。
---
## 六、总结
Oracle 的 Password Verifier 机制从 10G 到 12C 的演进,体现了数据库安全技术从简单哈希到现代密码学的跨越。10G 版本基于不安全的 MD5 算法且无 Salt 机制,已被淘汰;11G 版本引入了 Salt 和迭代哈希,安全性大幅提升;12C 版本采用 PBKDF2 和 SHA-512,符合现代密码安全标准。在 Oracle 19c 中,默认配置下(`SQLNET.ALLOWED_LOGON_VERSION_SERVER=12`),新用户会同时生成 11G 和 12C 两个版本的 Verifier,这种设计在安全性与兼容性之间取得了良好的平衡。数据库管理员应根据实际环境需求,合理配置密码验证参数,确保数据库身份验证的安全性和可靠性。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




