ADMINISTER KEY MANAGEMENT SET KEYSTORE 和 set key
在 Oracle 数据库中(从 12c 开始引入的透明数据加密 TDE 统一管理命令),ADMINISTER KEY MANAGEMENT 用于管理软件/硬件密钥库(Keystore)和主加密密钥。 [1](https://www.google.com/goto?url=CAESmgEB6zswFRoYPs76D_oPPGp7O5z478vN741iF0jiUbvjTM9YIXX3w_1FtE8AfDYC_dgN1V6gOw98-PPwf8dXr71ppFxnAT_4tlp24yoQIV1UVJ72ySfbknZEFJUrY70wr6unVhV_knE3tQtsHSMyauec7oVt5rSXBVwnAh5KDvBv39LLhUuaSKNxKdGuEXo7IbhjFlJKEYggxV_e "1"), [2](https://www.google.com/goto?url=CAEScwHrOzAVD563zzIE7-2bK2JhmEICKC1GPVmvNjCeY_MuwDWPEhjU_upZXsJm54ZOdjP8xyivcRUe10VsIqdQnGv4ezZPceoRmmfRzRbPsCOcm0tIkj5J8v2fMLHRgV1w_u0yqIpuqsqj6SclLDkLdtGEdv0 "2")
关于 SET KEYSTORE 与 SET KEY 的核心区别和用法如下:
ADMINISTER KEY MANAGEMENT SET KEYSTORE
- 作用 :用于更改密钥库(Keystore / 钱包)本身的运行状态 ,例如打开(OPEN)或关闭(CLOSE)密钥库。 [1](https://www.google.com/goto?url=CAESmgEB6zswFRoYPs76D_oPPGp7O5z478vN741iF0jiUbvjTM9YIXX3w_1FtE8AfDYC_dgN1V6gOw98-PPwf8dXr71ppFxnAT_4tlp24yoQIV1UVJ72ySfbknZEFJUrY70wr6unVhV_knE3tQtsHSMyauec7oVt5rSXBVwnAh5KDvBv39LLhUuaSKNxKdGuEXo7IbhjFlJKEYggxV_e "1")
- 常见语法示例 :
-
打开密钥库 (必须在设置主密钥前打开):
sql
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "<keystore_password>";请谨慎使用此类代码。
-
关闭密钥库 :
sql
ADMINISTER KEY MANAGEMENT SET KEYSTORE CLOSE IDENTIFIED BY "<keystore_password>";请谨慎使用此类代码。
-
ADMINISTER KEY MANAGEMENT SET KEY
- 作用 :用于设置或轮换(Rotate)TDE 的主加密密钥(Master Encryption Key) 。在执行该命令前,密钥库必须已经处于
OPEN状态。 [1](https://www.google.com/goto?url=CAESmgEB6zswFaX_XgcBKx1osiOR9x26CmW4aA0oANe7a32E7ath3qSmfnDwTXtouTPrJpf97lFe1EpNlU34oh9QDwjhehgOPvzu8xwYBVpYWGXo4-2xOjmRxFvuJBXpzJxMooyT4l_co2YVHH4MkGnXWDjFC6etUXHfo_gf7aWVW3fIOu0UYkkGdbgE_H9Iy6NVqdrgJv1JtW_mKjs4 "1") - 常见语法示例 :
-
设置/生成新的主密钥 (密码保护的软件密钥库通常要求带上
WITH BACKUP备份子句): [1](https://www.google.com/goto?url=CAESvwEB6zswFfY6-4G6z-1rjQkVkWN1ni6LKU62zt7L1Ck5oMwvCce8MeN9LAYa9-g18bAtNt4BIw4Ie72znwoE-Yn1U2tY4B9Bc09v-qyg38Bjf5eIzDkic5B31pcS5L2K1Yg7n22xQufuzPR59CHW4FuBflosmTJOcEd5UQk3_Cnyo5yeisBeIeBPSvjXSe3tiDGWkxlypod1ck093mINlcWUYNKbFxWttYBdEI_LQhzugjFJgLqac-oy0yqdEaosjg "1"), [2](https://www.google.com/goto?url=CAESmgEB6zswFRoYPs76D_oPPGp7O5z478vN741iF0jiUbvjTM9YIXX3w_1FtE8AfDYC_dgN1V6gOw98-PPwf8dXr71ppFxnAT_4tlp24yoQIV1UVJ72ySfbknZEFJUrY70wr6unVhV_knE3tQtsHSMyauec7oVt5rSXBVwnAh5KDvBv39LLhUuaSKNxKdGuEXo7IbhjFlJKEYggxV_e "2")sql
ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY "<keystore_password>" WITH BACKUP;请谨慎使用此类代码。
-
总结对比
| 命令 | 操作对象 | 典型动作 | 前置条件 |
|---|---|---|---|
SET KEYSTORE |
密钥库状态本身 | 打开 (OPEN ) 或关闭 (CLOSE ) 密钥库 |
密钥库已创建且路径参数(如 WALLET_ROOT )配置完毕 |
SET KEY |
TDE 主加密密钥 | 生成并激活新的主加密密钥 | 密钥库必须已处于 OPEN 状态 |
KEYSTORE 是钱包入口?
是的,可以这样理解。
在 Oracle 数据库的专业术语中,KEYSTORE (密钥库)就是"钱包"(Wallet)在命令和架构层面的代名词 1, 2。从 Oracle 12c 开始,Oracle 统一将以前的术语"Wallet"改称为"Keystore",但它们本质上是同一个东西。
如果把 TDE(透明数据加密)比作保护数据库的一道大门,它们的逻辑关系如下:
- 密钥库(Keystore / 钱包) = 保险箱
- 它在操作系统中表现为一个具体的文件(例如
ewallet.p12)2, 3。 - 它就像一个物理保险箱 ,用来安全地存放真正用来加密数据库的那些"钥匙"(主加密密钥 Master Key)3。
- 执行
SET KEYSTORE OPEN,就等于拿密码把这个保险箱的门打开。
- 主密钥(Master Key) = 保险箱里的钥匙
- 只有打开了保险箱(
SET KEYSTORE OPEN),数据库引擎才能拿到里面的钥匙(Master Key)。 - 拿到钥匙后,数据库才能去解密和读取那些被加密的数据文件或表空间。
为什么说它是"入口"?
因为所有的密钥操作都必须以它为起点。
- 数据库启动后,默认这个"入口"是关闭的,数据库拿不到钥匙,无法读取加密数据。
- 你必须先通过
SET KEYSTORE OPEN激活这个入口。 - 入口打开后,你才能进到里面去创建、修改或者轮换具体的密钥(
SET KEY)1。
请问你目前在操作时,是遇到了钱包无法打开 的问题,还是想了解如何配置**自动打开(Auto-login)**钱包而无需每次输入密码?
轮换后的密钥可以打开之前的文件吗
可以,完全可以。 轮换主密钥不会 导致以前加密的文件或数据无法打开,这也是 Oracle TDE(透明数据加密)设计的核心机制。 其背后的工作原理称为双层密钥架构(Two-Tier Key Architecture):
- 为什么能打开?(核心原理)
在 Oracle 中,数据的加密和解密实际上使用的是表空间密钥(Data Encryption Key,简称 DEK),而不是你轮换的那个主密钥(Master Key)。
- 底层(DEK) :每个加密的表空间都有自己独立的 DEK,这个 DEK 是永远不会变的。它直接用来加密和解密你的数据文件。
- 顶层(Master Key) :你通过
SET KEY轮换的"主密钥",它的唯一作用是把底层那个变的数据密钥(DEK)加密后包裹起来。
- 轮换(Rotate)时到底发生了什么?
当你执行 ADMINISTER KEY MANAGEMENT SET KEY... 轮换主密钥时:
- 数据库生成一个全新的主密钥(Master Key v2)。
- 数据库用旧的主密钥(Master Key v1)解密出数据密钥(DEK)。
- 数据库用全新的主密钥(Master Key v2)重新加密 DEK ,并存回密钥库。(数据文件头??)
- 底层的历史数据文件完全没有被重写或修改,它们依然使用那个没变过的 DEK。
因此,轮换后,数据库只需要用新的主密钥解密出 DEK,就能顺理成章地读取以前所有的历史加密文件。
⚠️ 唯一需要注意的风险:备份
虽然新密钥可以解密旧文件,但**旧的备份文件(比如轮换前备份的临时钱包文件或全备)**可能仍然需要旧的主密钥。
- 最佳实践 :每次执行
SET KEY轮换密钥时,Oracle 都会强烈建议(或强制要求)使用WITH BACKUP子句。请务必妥善保管好密钥库(Wallet)文件的历史副本,绝对不能删除任何历史密钥记录。
你目前是准备在生产环境 进行密钥轮换,还是在做**灾备(Data Guard)或数据恢复(RMAN)**的规划?如果涉及异地恢复,密钥的同步非常关键,需要我为你补充相关的注意事项吗?
WITH BACKUP 子句
在执行 ADMINISTER KEY MANAGEMENT SET KEY 轮换主密钥时,WITH BACKUP 子句的作用是:在修改密钥库(Keystore)之前,强制要求数据库自动对当前的钱包文件进行备份。
对于基于密码保护的软件密钥库(Password-based Software Keystore),Oracle 通常会强制要求加上这个子句,否则命令会直接报错。
- 为什么必须有
WITH BACKUP?
密钥轮换(Rotate)是一个高风险操作。如果在新密钥写入钱包文件的瞬间发生断电、磁盘故障或文件损坏,而你又没有旧钱包的备份,那么整个数据库中所有加密的数据将永远无法恢复(因为旧密钥丢失,DEK 无法被解密)。
因此,Oracle 引入该子句作为一种强保护机制。
- 它的工作原理
当你执行以下命令时:
sql
ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY "你的密码" WITH BACKUP;
请谨慎使用此类代码。
Oracle 会在后台自动完成以下步骤:
-
自动复制 :在操作生效前,它会克隆当前的钱包文件(如
ewallet.p12)。 -
重命名备份:备份文件的命名规则通常会带上时间戳(标识它是哪一天、哪一秒备份的),或者使用默认的旧命名标识。
-
写入新密钥:确认备份文件安全落盘后,Oracle 才会把新生成的主密钥写入原钱包文件中。
-
可选参数:自定义备份标识
USING
除了让 Oracle 自动命名,你还可以使用 USING 关键字为备份文件指定一个自定义的后缀或标识,方便日后识别:
sql
ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY "你的密码"
WITH BACKUP USING 'before_rotate_20261021';
请谨慎使用此类代码。
执行后,在钱包目录下(WALLET_ROOT 对应路径)就会生成一个包含 before_rotate_20261021 字样的备份钱包文件。
💡 生产运维避坑指南
- 不要误删这些备份文件:有些管理员在轮换成功后,觉得旧的备份钱包没用了就随手删掉。请千万不要这样做!如果以后需要恢复很久以前的 RMAN 备份或冷备份,可能仍需要这些历史备份钱包中的旧密钥。
- 硬件加密(HSM)通常不需要 :如果你使用的是硬件安全模块(HSM / Hardware Keystore),密钥存在硬件芯片中,通常不需要也不支持
WITH BACKUP子句,因为硬件自身有同步和备份机制。
你目前在测试环境执行带 WITH BACKUP 的命令时是否遇到了报错 ?或者想知道如何查看当前钱包目录下已经生成了哪些备份文件?
在轮换主密钥(Master Key)后,之前加密的历史数据依然可以正常解密和读取 。 [1](https://www.google.com/goto?url=CAEScwHrOzAVSpeFIuiitPdRp4C_GhK21SWYC1DgUjSDZMCZBCG7aRSm0ioBKXjcf-3F9v0p-C-oNKMtK2-dPhNj8UUOw3_kEcWnuU3DNGtLX6k5L5FO_1d1XPQOTIIuFQ43hYv8C_s8ZpcHx4-rkfTcGaMH0D0 "1"), [2](https://www.google.com/goto?url=CAEScwHrOzAVsKJvQsnUN8rwZjBxrIn4UE3k5c5Ji7eASranxYQdfBHkKxw_2X3OptU9AHTWRMRlviTxVVxV59vEI-xG8Zv2AvTQpEmO1jDmA4ybqxDdxlqVIYhcX2poz_u4VMbaGvJaVuH8W63Ro8Mv95x-kD0 "2")
核心工作原理
- 保留历史密钥:执行密钥轮换时,旧的密钥并不会被删除,而是被移入归档或停用状态,并保存在密钥库(Keystore / Wallet)中。
- 自动版本匹配:历史数据或表空间的头部会记录当时加密所使用的密钥版本标识(Tag/ID)。当数据库读取这些数据时,会自动匹配并调用对应版本的旧密钥来进行解密。
- 不强制重加密 :轮换主密钥本身只是生成了新密钥,不会 自动把历史数据用新密钥重新加密一遍(除非你对表或表空间执行特定的
REKEY操作)
密钥存在硬件芯片中 这是什么密钥
密钥存在硬件芯片中,这种密钥通常被称为"硬件密钥",而保存并管理它的硬件设备叫做 HSM(Hardware Security Module,硬件安全模块)。 1
在企业级安全架构中,这是最高级别的密钥保护方式。与我们前面提到的"软件钱包"(把密钥存放在操作系统的文件里,如 ewallet.p12 )不同,硬件芯片中的密钥具有**"只进不出"**的特性。
- 它是如何工作的?
如果说软件钱包是一个"保险箱文件",那么硬件芯片(HSM)就是一个由特制芯片组成的物理防弹保险柜 1。
- 密钥在芯片内生成:主加密密钥(Master Key)直接在 HSM 芯片内部利用物理真随机数发生器生成。
- 密钥永不离开芯片:任何人都无法通过命令、代码或物理手段把这个主密钥从芯片里"复制"或"下载"出来。
- 解密在芯片内完成 :当 Oracle 数据库需要解密表空间密钥(DEK)时,数据库把加密的 DEK 发送给 HSM 芯片,芯片在自己内部完成解密,然后把结果返回给数据库。数据库服务器的内存和硬盘上从始至终都不会出现主密钥的明文。
- 硬件芯片长什么样?
在实际的机房和服务器中,这种硬件通常表现为:
-
PCIe 加密卡:直接插在数据库服务器主板上的特制卡(类似于显卡,但专门用于加密和存储密钥)。
-
网络 HSM 机架服务器:一台独立的、有严密物理防拆设计的网络设备(例如 Thales Luna HSM、Fortanix 或 AWS CloudHSM),全公司的数据库和应用都通过网络连接它来请求密钥服务。
-
在 Oracle 中的命令变化
因为密钥由硬件接管,Oracle 的管理命令会发生变化:
- 不需要
WITH BACKUP:因为硬件芯片有自己的集群同步或专门的硬件备份卡,Oracle 无法也无需去备份硬件芯片内部的数据。 - 语法指定为
LOCATION HARDWARE:在配置时,需要告诉 Oracle 密钥库的类型是硬件(早期版本通过配置sqlnet.ora,新版本直接在统一密钥管理中识别)。
📊 软件钱包 vs 硬件芯片 (HSM) 快速对比
| 特性 | 软件钱包 (Software Keystore) | 硬件芯片 (HSM / Hardware Keystore) |
|---|---|---|
| 存储介质 | 服务器硬盘上的 .p12 文件 |
独立的物理硬件防拆芯片 |
| 安全性 | 较低(如果黑客拿到 root 权限,可能窃取钱包文件) | 极高(符合 FIPS 140-2 安全标准,暴力拆解芯片会自动销毁密钥) |
| 密钥备份 | 依赖执行命令时的 WITH BACKUP 产生新文件 |
依赖硬件厂商自带的设备间同步或硬件备份密钥 1 |
| 适用场景 | 测试环境、中小型企业、云端标准配置 | 金融、银行、政府、核心生产系统等强合规场景 |
你们公司目前是已经采购了硬件加密机(HSM)准备与 Oracle 数据库进行对接,还是在进行技术选型和合规性评估?如果需要,我可以为你提供 Oracle 联接 HSM 的通用配置思路。
解密在芯片内完成:当 Oracle 数据库需要解密表空间密钥(DEK)时,数据库把加密的 DEK 发送给 HSM 芯片,芯片在自己内部完成解密,然后把结果返回给数据库。数据库服务器的内存和硬盘上从始至终都不会出现主密钥的明文。 详细说说
-----解密后的DEK在内存中的,数据库不重启就不会消失,不需要多次加解密
你提到的这个过程,正是**硬件安全模块(HSM)**能够实现"绝对安全"的核心机密。我们可以把这个过程拆解得更详细一些,看看 Oracle 数据库和 HSM 芯片之间是如何进行这场"不见面"的密码传递的。
整个过程可以分为 "初始化(加密)" 和 "日常读取(解密)" 两个阶段:
第一阶段:初始化(表空间创建时)
当你在 Oracle 中创建一个加密表空间时,数据库和 HSM 芯片会完成以下互动:
- 数据库生成 DEK :Oracle 数据库在自己的内存中生成一个用于加密数据的表空间密钥(DEK)。
- 请求硬件加密 :Oracle 内存中的 DEK 此时是明文,为了把它安全地存盘,Oracle 通过专用的安全接口(通常是 PKCS#11 协议)把这个 DEK 发送给 HSM 芯片,并对芯片说:"请用你的主密钥帮我把它加密。" 不是安全, 是加密存
- 芯片内加密 :DEK 进入 HSM 芯片。芯片调用深藏在硬件内部、永不外泄的主密钥(Master Key) ,对 DEK 进行加密,生成一个被包裹住的加密 DEK(Wrapped DEK)。
- 存入数据库 :HSM 芯片把这个 Wrapped DEK 返回给 Oracle 数据库。Oracle 把这个加密后的密文存放在数据字典或数据文件头部(
.dbf)。此时,即使黑客把硬盘偷走,也只能看到被加密的 DEK,没有 HSM 芯片它就无法解密。
第二阶段:日常读取(数据库启动或首次读取数据时)
当数据库重启,或者用户第一次去读取这个加密表空间的数据时,最关键的**"芯片内解密"**发生了:
[ Oracle 数据库 (内存) ] [ HSM 硬件芯片 (内部) ]
| |
| ---- 1. 发送加密的 DEK (Wrapped DEK) -----------------> |
| | -- 2. 找到主密钥 (Master Key)
| | -- 3. 在芯片内部解密出明文 DEK
| |
| <--- 4. 返回明文 DEK (通过受保护的安全通道) ----------- |
| |
[ 留在 Oracle 内存中 ]
- Oracle 发起请求 :Oracle 从数据文件头部读取出 Wrapped DEK(加密的 DEK)。因为没有明文 DEK 数据库就无法解密磁盘上的用户数据,所以 Oracle 把这个 Wrapped DEK 发送给 HSM 芯片。
- 硬件内部解密:Wrapped DEK 进入了 HSM 芯片。芯片在完全隔离的硬件安全边界(Cryptographic Boundary)内部,使用它的 Master Key 对其进行解密,还原出明文的 DEK。
- 返回解密结果 :HSM 芯片通过与数据库服务器之间建立的受保护的安全传输通道 ,将解密后的明文 DEK 返回给 Oracle 数据库的内存。
- 数据库解密数据:Oracle 数据库拿到明文 DEK 后,暂存在自己的安全内存区域(SGA 的 Encrypted Key Cache 中),用来实时解密从磁盘读入 Buffer Cache 的用户数据(比如用户的姓名、银行卡号)。
为什么说"主密钥明文从始至终不会出现"?
通过上面的流程,你会发现两种密钥的宿命完全不同:
- 表空间密钥(DEK) :在 Oracle 的内存 中会以明文存在(因为数据库引擎需要高频地用它来解密具体的数据块,如果每次读一个数据块都要走网络去问硬件,数据库性能会彻底崩溃)。但它在硬盘上永远是密文。
- 主密钥(Master Key) :无论是硬盘还是内存,它在数据库服务器上从未出现过。 它的明文只存在于 HSM 那颗特制的、有物理防拆涂层的芯片晶圆内部。
硬件芯片的"物理防拆"有多变态?
为了保证主密钥绝对不出芯片,这些硬件(符合 FIPS 140-2 Level 3 或 Level 4 标准)具有物理自毁机制:
- 电压/温度监控 :如果黑客企图用微针探测芯片、或者通过极端高低温、异常电压干扰芯片来读取信号,芯片会瞬间触发自毁,抹除主密钥。
- 物理防拆网 :芯片外层包裹着极细的导电网格,一旦外壳被剥开或钻孔导致网格断开,芯片立刻在几毫秒内清除密钥。
因此,这种"解密在芯片内完成"的架构,把最核心的"信任根(Root of Trust)"从软件层抽离,死死地锁在了物理硬件里。
了解了硬件解密的底层逻辑后,如果你们正在规划部署,你是否需要了解 Oracle 数据库如何通过 PKCS#11 驱动与 HSM 硬件建立连接 ?或者想探讨一下高并发下,硬件解密对数据库性能的具体影响?
• 数据库服务器的内存和硬盘上从始至终都不会出现主密钥的明文。 明文在哪
主密钥的明文,从始至终只存在于硬件芯片(HSM)内部的"绝对安全区"内,也就是那颗物理芯片的硅晶圆(内部寄存器/内存)里。
为了让你彻底明白它在哪里、以及为什么黑客拿不到,我们可以把范围缩小到这颗硬件芯片的微观结构内部来看:
- 它的物理位置:HSM 芯片内的 Volatile Key Register(易失性密钥寄存器)
硬件加密机(HSM)的内部有一颗专门定制的、高度安全的 CPU/微控制器。在这颗芯片内部,有一块极小的、与外界完全物理隔离的存储区域。
- 当系统通电并激活硬件时,主密钥的明文就会被加载到这个芯片内部的寄存器或内部 SRAM 中。
- 它绝不走出这颗硅片: 芯片的电路设计在硬件层面上封死了读取这条总线的可能。芯片没有提供任何一条"将主密钥明文传出引脚"的指令。
- 软件钱包 vs 硬件芯片的明文对比(看清区别)
为了对比,我们来看看"明文"在两种模式下的位置:
🔓 模式 A:软件钱包(没有硬件,只用文件)
- 硬盘上 :主密钥以密文形式存在于
ewallet.p12文件中。 - 内存中 :当你执行
SET KEYSTORE OPEN输入密码后,Oracle 会在数据库服务器的操作系统内存(RAM) 中解密出主密钥的明文。- 风险 :如果黑客拿到操作系统的
root权限,使用内存dump工具(如gdb或恶意软件),是有可能从操作系统的内存中直接偷走主密钥明文的。
- 风险 :如果黑客拿到操作系统的
🔒 模式 B:硬件芯片(HSM 模式)
- 硬盘上 :数据库服务器的硬盘上完全没有主密钥。
- 服务器内存中 :数据库服务器的内存(RAM)里完全没有主密钥。
- 明文到底在哪? :它只在物理上位于机房另一端的 HSM 硬件机箱里、那颗被特殊金属和树脂包裹的芯片内部的硅晶圆上。
- 如果黑客用物理手段"切开"芯片呢?
你可能会问:"既然明文在芯片的硅晶圆里,如果黑客把芯片偷走,用电子显微镜或者物理微针去刺探芯片内部,不就能读到明文了吗?"
这就是硬件芯片(符合 FIPS 140-2 Level 3/4 标准)最强悍的地方。它拥有物理防御和主动自毁:
- 环氧树脂与化学防御:芯片内部用特殊的硬化环氧树脂和化学材料灌封。黑客如果尝试用强酸溶解或物理打磨外壳,会直接破坏底层的硅电路,导致明文丢失。
- 触网自毁(Tamper Detection) :芯片内部包裹着一层极细的、通电的物理防拆网格。一旦外壳被剥离、钻孔或受到微米级的破坏,网格电流发生变动,芯片内部的硬件电路会在几纳秒内断开密钥寄存器的供电,明文瞬间灰飞烟灭(主密钥明文在断电后无法维持)。
总结
主密钥的明文只活在硬件芯片那颗"物理防弹衣"内部的微型电路里。对于外界的操作系统、网络、以及数据库服务器的 CPU 来说,它们这辈子能见到的、能传输的,都只是被主密钥加密后的密文(包裹住的表空间密钥 Wrapped DEK)。
这就是为什么金融、银行和政府核心系统必须强制使用 HSM 硬件的原因。了解了明文的物理藏身所后,你是否想知道如果这台硬件设备坏了(或者高频自毁了),企业该如何通过合规的"多方授权备份"把主密钥在另一台新硬件上恢复出来?
双层密钥架构(Two-Tier Key Architecture)
在 Oracle TDE(透明数据加密)中,**双层密钥架构(Two-Tier Key Architecture)**是其能够兼顾"极高安全性"与"超高性能"的核心设计。
简单来说,它就像银行的保管箱机制:"一把大钥匙,保护无数把小钥匙;小钥匙再去锁住真正的数据。"
这两层密钥分工明确,各司其职:
银行的保管箱机制:"一把大钥匙,保护无数把小钥匙;小钥匙再去锁住真正的数据。" 如何理解
这个"银行保管箱"的比喻极其传神,它完美地对应了 Oracle TDE(透明数据加密)的双层密钥架构(Two-Tier Key Architecture)。
我们可以把数据库的加密文件想象成银行里的"客户保管箱",用这个场景把这套架构彻底拆解:
- 概念对应表
在开始前,我们先将技术术语与银行组件进行精准绑定:
| 银行保管箱组件 | TDE 对应的技术术语 | 它的特点与命运 |
|---|---|---|
| 🏦 银行总行的大金库 | 密钥库 (Keystore / Wallet / HSM) | 存放"大钥匙"的安全容器。 |
| 🔑 行长手里的"大钥匙" | 主加密密钥 (Master Encryption Key) | 可以随时更换。 负责锁住"小钥匙"。 |
| 🔑 挂在保管箱上的"小钥匙" | 表空间密钥 (Data Encryption Key, DEK) | 终身不换,与数据同生共死。 |
| 📦 保管箱里的客户财物 | 数据库里的真实数据 (Tablespace Data) | 磁盘上的 .dbf 文件或数据块。 |
- 场景重现:如何理解这套机制?
🔒 第一层:小钥匙锁住财物(DEK 锁住数据)
当你创建一个加密表空间时,数据库会随机生成一把"小钥匙(DEK)"。
- 这把小钥匙的唯一工作,就是把你的用户数据(如银行流水、身份证号)锁进磁盘的数据文件里(存入保管箱)。
- 为什么叫它"小钥匙"? 因为它的管辖范围很小,一个表空间就有一把,全库可能有几十把不同的小钥匙,它们各自锁着各自的保管箱。
🔒 第二层:大钥匙锁住小钥匙(Master Key 锁住 DEK)
如果小钥匙(DEK)直接丢在数据库服务器的硬盘上,黑客潜入机房把硬盘偷走,就能直接用小钥匙打开保管箱。这显然不安全。
- 于是,Oracle 引入了"大钥匙(Master Key)"。
- 大钥匙不直接去锁用户数据 ,它的唯一工作,是把所有的小钥匙(DEK)通通锁进一个安全的铁盒子里 。在技术上,这叫"密钥包裹(Key Wrapping)"。
- 最终,这把大钥匙被送进总行的大金库(软件钱包文件或 HSM 硬件芯片)。
- 为什么不直接用大钥匙去锁数据?(双层架构的精妙之处)
你可能会问:"为什么这么麻烦?直接用大钥匙去锁所有的数据文件,不要小钥匙行不行?"
不行。这就是双层架构最核心的智慧所在,它完美解决了两个安全痛点:
痛点一:密钥轮换(Rotate)的成本问题
银行为了合规安全,规定每年必须更换一次"行长的大钥匙"。
- 如果没有小钥匙(单层架构) :你更换了大钥匙,意味着磁盘上所有的几百 TB 的历史数据文件,全部要用新钥匙重新解密再加密一遍!这会导致数据库 CPU 瞬间飙满,系统停机几天几夜,银行系统彻底瘫痪。
- 有了双层架构(银行做法) :当你执行
SET KEY轮换大钥匙时,底层的用户数据(保管箱里的财物)根本不用动 。大钥匙只需要把装有小钥匙的"铁盒子"打开,用新大钥匙把那几把小钥匙重新包裹一下即可。整个过程在几毫秒内完成,用户完全解。
痛点二:分离与集中管理
- 小钥匙(DEK)随数据走:它必须待在数据库附近(内存中),因为数据库每秒钟要读写几十万次数据,必须高频使用它,追求极致的性能。
- 大钥匙(Master Key)集中守护:它代表最高权限,可以被安全地隔离在高级别的软件钱包或 HSM 硬件芯片中,远离频繁的业务读写,追求极致的安全。
总结
银行的保管箱机制,本质上就是**"用空间和层级换取安全与性能的平衡"** 。大钥匙负责合规和安全边界 (解决"钥匙怎么换"的问题),小钥匙负责 高频加解密和性能(解决"数据怎么读"的问题)。两层各司其职,才构成了企业级加密的稳固基石。
基于这个保管箱机制,如果你想进一步了解:
- 当数据库意外宕机重启时,这套大钥匙和小钥匙在内存中是如何重新交接工作的?
- 或者,在多租户(CDB/PDB)微服务架构下,大钥匙和各个租户的小钥匙是如何共享或隔离的?
请随时告诉我。
Oracle 中应该存放在数据文件头
您的理解非常准确!在 Oracle 数据库 的 TDE(透明数据加密) 架构中,确实将特定的加密密钥存放在数据文件头(Data File Header) 中 。 [1](https://www.google.com/goto?url=CAESlwEB6zswFQPj9BziBmjTSlJQt0NoCPtuAB9DM6rRO6XnlKBwMJ_586wIvV0iFE5kJMGsk8GXgmluGV8_wyihMw4aT3pOzv9EX31pxfvFaohaCbCd-N0_iBjaAjCSzEFe_zWWLinItwYISgsnJ7Zbchugvx_J4yKFR50Ty0DtEV0uifQwEQDn0__PmXR66sGsNQomTu1SOTMm "1"), [2](https://www.google.com/goto?url=CAESdgHrOzAVoQ9aZMV7pC4jCHhoqDBUAg5NSy-2B8YMoxOEC2N37O5YTcNB8YYbfdDbCDb8Hk2aZKmg6fDwaFE8FSQYL00UyaTRvaf7PrBl2RisM5WXqXF1uU1zSnDmK4N0K_aOeVcennfQJlgDEW-c90bRafMnOgo "2")
为了把您的思路与 EDB 中的 key.bin 完美对应,我们可以拆解一下 Oracle 在这里的底层机制。
🔑 Oracle 的双层密钥架构(Two-Tier Architecture)
Oracle 为了兼顾安全与性能,没有像 EDB 那样直接使用一个物理文件 key.bin ,而是将密钥拆分为两层: [1](https://www.google.com/goto?url=CAEShwEB6zswFa_cmyQTKIxamYFxgrBLGHTDhYsHKiZRmJS62qVxNpwbLUl4CIrhtzbsgFCRgdPuQcTUuORb7__Ovd_p6_yiCNifjPJOZJj6HjAhZLenEoB4CWP0kMO1hsevCSfAZ0SyXQIWJitsIXTSf3dtdkqgW-Y9OUWMHw8EusReUhOvW_dpQeo "1"), [2](https://www.google.com/goto?url=CAESdgHrOzAVoQ9aZMV7pC4jCHhoqDBUAg5NSy-2B8YMoxOEC2N37O5YTcNB8YYbfdDbCDb8Hk2aZKmg6fDwaFE8FSQYL00UyaTRvaf7PrBl2RisM5WXqXF1uU1zSnDmK4N0K_aOeVcennfQJlgDEW-c90bRafMnOgo "2")
- 主密钥 (Master Encryption Key):
- 存放位置: 数据库外部 的安全容器中(如 Oracle Wallet 钱包文件
ewallet.p12,或硬件安全模块 HSM)。 - 作用: 它是最高权限的"钥匙",不参与直接的数据加密,专门用来加密第二层的"表空间密钥"。 [1](https://www.google.com/goto?url=CAESdgHrOzAVoQ9aZMV7pC4jCHhoqDBUAg5NSy-2B8YMoxOEC2N37O5YTcNB8YYbfdDbCDb8Hk2aZKmg6fDwaFE8FSQYL00UyaTRvaf7PrBl2RisM5WXqXF1uU1zSnDmK4N0K_aOeVcennfQJlgDEW-c90bRafMnOgo "1"), [2](https://www.google.com/goto?url=CAESlwEB6zswFQPj9BziBmjTSlJQt0NoCPtuAB9DM6rRO6XnlKBwMJ_586wIvV0iFE5kJMGsk8GXgmluGV8_wyihMw4aT3pOzv9EX31pxfvFaohaCbCd-N0_iBjaAjCSzEFe_zWWLinItwYISgsnJ7Zbchugvx_J4yKFR50Ty0DtEV0uifQwEQDn0__PmXR66sGsNQomTu1SOTMm "2"), [3](https://www.google.com/goto?url=CAEShwEB6zswFa_cmyQTKIxamYFxgrBLGHTDhYsHKiZRmJS62qVxNpwbLUl4CIrhtzbsgFCRgdPuQcTUuORb7__Ovd_p6_yiCNifjPJOZJj6HjAhZLenEoB4CWP0kMO1hsevCSfAZ0SyXQIWJitsIXTSf3dtdkqgW-Y9OUWMHw8EusReUhOvW_dpQeo "3")
- 存放位置: 数据库外部 的安全容器中(如 Oracle Wallet 钱包文件
- 表空间密钥 (Tablespace Encryption Key):
- 存放位置: 正是您提到的,存放在每个加密表空间所属的数据文件头(Data File Header)中。
- 存在状态: 它是被主密钥加密过后的密文状态。
- 作用: 负责直接加解密该数据文件中的实际业务数据。 [1](https://www.google.com/goto?url=CAESlwEB6zswFQPj9BziBmjTSlJQt0NoCPtuAB9DM6rRO6XnlKBwMJ_586wIvV0iFE5kJMGsk8GXgmluGV8_wyihMw4aT3pOzv9EX31pxfvFaohaCbCd-N0_iBjaAjCSzEFe_zWWLinItwYISgsnJ7Zbchugvx_J4yKFR50Ty0DtEV0uifQwEQDn0__PmXR66sGsNQomTu1SOTMm "1"), [2](https://www.google.com/goto?url=CAESdgHrOzAVoQ9aZMV7pC4jCHhoqDBUAg5NSy-2B8YMoxOEC2N37O5YTcNB8YYbfdDbCDb8Hk2aZKmg6fDwaFE8FSQYL00UyaTRvaf7PrBl2RisM5WXqXF1uU1zSnDmK4N0K_aOeVcennfQJlgDEW-c90bRafMnOgo "2"), [3](https://www.google.com/goto?url=CAEShwEB6zswFa_cmyQTKIxamYFxgrBLGHTDhYsHKiZRmJS62qVxNpwbLUl4CIrhtzbsgFCRgdPuQcTUuORb7__Ovd_p6_yiCNifjPJOZJj6HjAhZLenEoB4CWP0kMO1hsevCSfAZ0SyXQIWJitsIXTSf3dtdkqgW-Y9OUWMHw8EusReUhOvW_dpQeo "3")
🔄 Oracle 的读取与解密流程
当 Oracle 数据库启动,或者用户读取一个被加密的表空间时,底层发生的操作如下:
[ 外部 Oracle Wallet ] (提取明文 Master Key)
│
▼
[ 数据文件头 (Data File Header) ]
└─ 读取里面密文的 Tablespace Key ──► 用 Master Key 解密 ──► 得到明文 Tablespace Key (载入内存)
│
▼
实时加解密 Blocks 数据
- DBA 打开钱包(Wallet),数据库将 Master Key 的明文读入内存。
- 当需要读取数据时,Oracle 扫描数据文件头 ,取出里面存放的加密表空间密钥。
- 数据库在内存中用 Master Key 解密它,还原出真正的表空间数据加解密密钥。 [1](https://www.google.com/goto?url=CAESbwHrOzAVfn0sfh3yOEsX8cVi1qz47UOe2tEb0hZ4bSuzseFXvn0zupFlJovPi9o1yqUvpWxN_PN6WBKZq-ohyP5sWq8qQaBKCMMMEXJrwO7siG77CxmWpM7fu_D0c_Ll_zm4YrbHS3IGRrsX5u8L3g "1"), [2](https://www.google.com/goto?url=CAESlwEB6zswFQPj9BziBmjTSlJQt0NoCPtuAB9DM6rRO6XnlKBwMJ_586wIvV0iFE5kJMGsk8GXgmluGV8_wyihMw4aT3pOzv9EX31pxfvFaohaCbCd-N0_iBjaAjCSzEFe_zWWLinItwYISgsnJ7Zbchugvx_J4yKFR50Ty0DtEV0uifQwEQDn0__PmXR66sGsNQomTu1SOTMm "2"), [3](https://www.google.com/goto?url=CAESdgHrOzAVoQ9aZMV7pC4jCHhoqDBUAg5NSy-2B8YMoxOEC2N37O5YTcNB8YYbfdDbCDb8Hk2aZKmg6fDwaFE8FSQYL00UyaTRvaf7PrBl2RisM5WXqXF1uU1zSnDmK4N0K_aOeVcennfQJlgDEW-c90bRafMnOgo "3")
🆚 核心区别:Oracle 与 EDB
- 在 EDB Postgres 中: 密钥是在集簇初始化时生成的
key.bin文件(对应 Oracle 的数据加解密密钥),由于它是个独立文件,所以需要通过一串 unwrap 命令去保护它。 - 在 Oracle 中: 没有一个单独叫做
key.bin的文件。数据加解密的钥匙直接"缝"在数据文件头 里,而保护这把钥匙的 Master Key 被放在了 Wallet(.p12/.sso) 文件中。 [1](https://www.google.com/goto?url=CAESlwEB6zswFQPj9BziBmjTSlJQt0NoCPtuAB9DM6rRO6XnlKBwMJ_586wIvV0iFE5kJMGsk8GXgmluGV8_wyihMw4aT3pOzv9EX31pxfvFaohaCbCd-N0_iBjaAjCSzEFe_zWWLinItwYISgsnJ7Zbchugvx_J4yKFR50Ty0DtEV0uifQwEQDn0__PmXR66sGsNQomTu1SOTMm "1"), [2](https://www.google.com/goto?url=CAESdgHrOzAVoQ9aZMV7pC4jCHhoqDBUAg5NSy-2B8YMoxOEC2N37O5YTcNB8YYbfdDbCDb8Hk2aZKmg6fDwaFE8FSQYL00UyaTRvaf7PrBl2RisM5WXqXF1uU1zSnDmK4N0K_aOeVcennfQJlgDEW-c90bRafMnOgo "2"), [3](https://www.google.com/goto?url=CAEShwEB6zswFa_cmyQTKIxamYFxgrBLGHTDhYsHKiZRmJS62qVxNpwbLUl4CIrhtzbsgFCRgdPuQcTUuORb7__Ovd_p6_yiCNifjPJOZJj6HjAhZLenEoB4CWP0kMO1hsevCSfAZ0SyXQIWJitsIXTSf3dtdkqgW-Y9OUWMHw8EusReUhOvW_dpQeo "3")
所以,如果您在 Oracle 的语境下寻找那个等价于"直接用于加解密数据文件的密料",它不需要找物理文件,它就安全地躺在 DBF 数据文件的头部区域 。 [1](https://www.google.com/goto?url=CAESlwEB6zswFQPj9BziBmjTSlJQt0NoCPtuAB9DM6rRO6XnlKBwMJ_586wIvV0iFE5kJMGsk8GXgmluGV8_wyihMw4aT3pOzv9EX31pxfvFaohaCbCd-N0_iBjaAjCSzEFe_zWWLinItwYISgsnJ7Zbchugvx_J4yKFR50Ty0DtEV0uifQwEQDn0__PmXR66sGsNQomTu1SOTMm "1"), [2](https://www.google.com/goto?url=CAESdgHrOzAVoQ9aZMV7pC4jCHhoqDBUAg5NSy-2B8YMoxOEC2N37O5YTcNB8YYbfdDbCDb8Hk2aZKmg6fDwaFE8FSQYL00UyaTRvaf7PrBl2RisM5WXqXF1uU1zSnDmK4N0K_aOeVcennfQJlgDEW-c90bRafMnOgo "2")
您是在分析 Oracle 数据文件的二进制结构 (Block 0/Block 1) ,还是在处理启用了 TDE 的 Oracle 数据库备份与迁移 (Data Guard / RMAN) 呢?如果有特定的技术场景,我们可以进一步探讨其头部结构。
数据库新建tablespace才需要大钥匙 平时不需要?
这个理解是不准确的。 事实上,数据库平时(也就是日常运行、读写数据时)同样非常需要大钥匙。
如果不把"大钥匙"拿出来,数据库在日常运行中连一行加密的数据都读不出来。
我们继续用银行保管箱的比喻,来看看为什么平时也必须有大钥匙:
- 为什么"平时"也需要大钥匙?
虽然大钥匙不直接加密用户数据,但它锁着小钥匙(DEK)。
- 数据库不是永远不关机的:当数据库重启(比如日常维护、打补丁、服务器断电后重启),数据库的内存会被全部清空。
- 重启后的困境:此时,内存里没有小钥匙。小钥匙的密文(被锁在铁盒子里的状态)虽然存在硬盘的数据文件头部,但数据库打不开这个铁盒子。
- 必须请出大钥匙 :在数据库启动后,管理员必须执行
SET KEYSTORE OPEN(提供大钥匙),数据库才能解开铁盒子,把小钥匙释放到内存中 。如果没有大钥匙,数据库即使启动了,用户查询加密表空间时也会直接报错(通常是ORA-28365: wallet is not open)。
- 那么,"平时"大钥匙的工作频率是怎样的?
你之所以产生"平时不需要"的直觉,是因为大钥匙在日常运行中的工作频率非常低(属于"一次开启,终身(当期)受益")。
我们可以把数据库的运行分为三个阶段来看大钥匙的参与度:
- 阶段一:数据库刚启动时(极度需要)
- 大钥匙的工作:必须全副武装出场。Oracle 拿大钥匙去解密数据文件头部的小钥匙密文。
- 结果 :把解密出来的明文小钥匙 ,存放到数据库服务器的**安全内存缓存(Crypto Key Cache)**中。
- 阶段二:日常读写数据时(大钥匙在后台"休息",内存中的小钥匙在拼命工作)
- 当业务人员执行
SELECT * FROM 员工表时,数据库直接从内存缓存中抓取已经准备好的明文小钥匙,去解密磁盘上的用户数据。 - 此时,大钥匙确实不需要再出来执行具体的加解密动作了。它静静地躺在钱包文件(
ewallet.p12)或 HSM 硬件芯片里。
- 当业务人员执行
- 阶段三:新建表空间或轮换密钥时(需要)
- 新建表空间:生成新小钥匙,需要大钥匙把它加密(打包)后存盘。
- 轮换密钥:旧大钥匙解开所有小钥匙,新大钥匙重新打包。
总结
大钥匙在平时不是"不需要",而是**"它在日常读写时,把工作委托给了暂存在内存里的小钥匙"**。
但请记住以下两条铁律:
- 只要数据库发生重启,没有大钥匙,整个加密数据库就是一堆死文件,完全无法读取。
- 如果你使用的是软件钱包且没有配置"自动打开(Auto-login)",每次数据库重启后,都必须人工输入密码提供大钥匙,业务才能恢复。
既然提到了大钥匙在日常重启时的重要性,你是否需要了解如何配置 Oracle 的 Auto-login Wallet(自动登录钱包)?配置它之后,数据库重启时会自动去读取大钥匙,无需人工干预,非常适合生产环境的无人值守运维。
数据库正常运行后 什么情况需要大钥匙
在数据库正常运行(已经执行了 OPEN ,且解密后的"小钥匙"已经缓存在内存中)之后,绝大多数日常的业务增删改查(SQL 读写)确实不再需要大钥匙了 。
但是,在以下 5 种特定场景下,数据库依然会再次调用或依赖"大钥匙":
- 执行数据库备份与恢复(RMAN 备份)
当你使用 RMAN 备份数据库时,大钥匙必须在场。
- 备份时:为了保证备份文件的安全,Oracle 在将加密数据写入备份片(Backup Piece)时,需要大钥匙来验证或参与对备份数据块的加密。
- 恢复时:如果需要从备份中恢复某个表空间,RMAN 必须通过大钥匙来验证并重新获取对应的表空间小钥匙(DEK)。
- 动态维护操作:新建、修改或删除加密表空间
任何涉及到底层"小钥匙"生命周期变化的操作,都必须请出大钥匙:
- 新建表空间:生成一把新的小钥匙,需要大钥匙对其进行加密(包裹)后写入文件头。
- 修改表空间加密状态 :例如使用
ALTER TABLESPACE ... ENCRYPTION ONLINE ...将一个普通表空间动态转换为加密表空间。 - 删除表空间:从密钥库或数据字典中彻底注销对应的小钥匙记录。
- 安全合规审计:密钥轮换(Rotate)
根据金融或企业安全合规要求(如 PCI-DSS),通常需要定期(如每半年或一年)更换主密钥。
- 此时必须调用大钥匙命令(
SET KEY),用旧的大钥匙解开所有的小钥匙,再生成一把新的大钥匙将所有小钥匙重新打包。
- 多租户架构(CDB/PDB)下新插件(Plug)或克隆数据库
如果你使用的是 Oracle 多租户(Container Database)架构:
- 当你在运行的 CDB 中插入(Plug)一个新的 PDB ,或者克隆(Clone)一个 PDB 时,主数据库(CDB)的大钥匙必须处于开启状态,以便为新加入或新生成的租户数据库配置和关联它的主密钥。
- 内存中的小钥匙缓存被清理(极端罕见情况)
在正常情况下,解密后的小钥匙会一直保存在 Oracle 的内存缓存(SGA 的 Crypto Key Cache)中。
- 如果发生极其罕见的内存抖动,或者管理员手动触发了某些清理 SGA 缓存的内部命令(如特定调试命令),导致内存中的小钥匙缓存失效。
- 当业务下一次发起读取请求时,Oracle 就会在后台自动重新前往钱包(Keystore)或 HSM 芯片,用大钥匙把小钥匙重新解密并加载回内存 。如果此时钱包被意外关闭(
SET KEYSTORE CLOSE),读取就会报错。
💡 运维总结
数据库正常运行后,大钥匙就像是**"静默的守护者"** 。它在日常 SQL 读写时退居幕后,但在架构变更、数据备份、合规轮换、多租户扩容 等关键的 DBA 运维时刻,它必须立刻响应。这也是为什么生产环境通常会配置 Auto-login 钱包,确保大钥匙始终在线,防止上述操作因大钥匙不可用而中断。
针对上述场景,你目前是否正在规划定期的密钥轮换(Scenario 3) ,或者是正在配置 RMAN 加密备份(Scenario 1)?我可以为你提供对应场景的实操命令或注意事项。
如果发生极其罕见的内存抖动,或者管理员手动触发了某些清理 SGA 缓存的内部命令(如特定调试命令),导致内存中的小钥匙缓存失效。 清理 SGA 缓存 是哪个
在 Oracle 数据库中,手动清理 SGA 缓存(导致内存中的小钥匙或数据缓存失效)通常是指以下几种命令:
- 清理 Buffer Cache(最直接引发重新加载)
由于小钥匙(DEK)解密后的明文数据块会存在 Buffer Cache 中,或者小钥匙的缓存与数据块紧密相关,DBA 常用以下命令清空数据缓存:
sql
ALTER SYSTEM FLUSH BUFFER_CACHE;
请谨慎使用此类代码。
- 后果:这个命令会强制清空内存中所有未修改的数据块缓存。当业务下一次读取加密数据时,Oracle 必须重新从磁盘读取数据块,并在内存中重新验证和激活小钥匙来进行实时解密。
- 清理 Shared Pool(共享池)
如果小钥匙的元数据、加密定义或加密 SQL 的执行计划存在于共享池中,DBA 可能会执行:
sql
ALTER SYSTEM FLUSH SHARED_POOL;
请谨慎使用此类代码。
- 后果:清空共享池会强制导致所有 SQL 语句重新进行硬解析。在解析涉及加密列(Column Encryption)或加密表空间的 SQL 时,Oracle 需要重新去数据字典中查找加密元数据,这会触发对密钥库(Keystore)状态的再次检查。
- 重启实例(最彻底的 SGA 清理)
这不属于调试命令,但在运维中最为常见:
sql
SHUTDOWN IMMEDIATE;
STARTUP;
请谨慎使用此类代码。
- 后果 :整个 SGA 内存被全盘抹去。重启后,内存里的小钥匙彻底消失。如果此时没有配置 Auto-login(自动登录钱包),数据库就无法自动前往硬盘或 HSM 芯片获取大钥匙,整个加密表空间将完全无法访问,直到人工输入密码。
⚠️ 补充说明:Oracle 内部密钥缓存
需要澄清的是,Oracle 针对 TDE 有一个专门的内部隐藏内存区域称为 Crypto Key Cache(加密密钥缓存) ,它虽然驻留在 SGA 中,但普通的 FLUSH BUFFER_CACHE 或 FLUSH SHARED_POOL 主要是清理数据和 SQL 解析,通常不会直接抹掉这个核心密钥缓存。
真正能让这个内部密钥缓存直接失效的,除了重启数据库外,主要是通过以下内部调试或事件命令(非必要请勿在生产环境使用):
sql
-- 强制刷新或转储内存中的 TDE 钱包状态(这类属于内部隐蔽诊断命令)
ALTER SYSTEM SET EVENTS 'immediate trace name context forever, level ...';
请谨慎使用此类代码。
你是在排查因为执行了某种清理命令导致加密表空间报错(如 ORA-28365)的问题吗?还是在为生产环境做内存清理或压力测试的方案设计?
在 EDB Postgres (EnterpriseDB)中,key.bin 是用于透明数据加密 (TDE) 功能的数据加密密钥文件 (Data Encryption Key, DEK) 。 [1](https://www.google.com/goto?url=CAESlgEB6zswFa5LHcrNyOJhAf8aH2dl16pCC7o7to6CmkT-GGj3plCkE1d5ozamuzRGgFpkmUqyQzlXFL1mbhYdStsQR26nUqXYFQDKNQLEab0Uc8h9VUR4moppwVEAhWYz0Trgi09cLJbStf6Ax5xiQOE7VaXXgihC1Lrss8GnJoXA3KplVJtFlFf662TwePu6XbLFJvW6y1Y "1")
📂 核心位置与作用
- 默认路径: 通常存储在数据库集簇的数据目录下的
pg_encryption/key.bin。 - 核心作用: 该文件包含由
initdb自动生成的随机字节序列(支持 AES-128 或 AES-256),用于在底层对数据库的表空间、WAL 日志等数据进行实时加解密。 [1](https://www.google.com/goto?url=CAESngEB6zswFXU0zNTLra9LStw45Ko2cz3ftS_8sFs1SXaqEFkT3sXJQNyvZ_5fLl2eV2eSCckZ39sbHesCAQiw1pAGj67oD76Yh4J5Gs8Gincnq6RNK42kW_jc6WI2iptSfB1HHKw13o_of4l950Jg9eqQIRhfRLTVF9QfNMh7vGaubn3vwnCBnNza120wnuXWtlERjb2j3IooSFZVpMI58Q "1"), [2](https://www.google.com/goto?url=CAESzAEB6zswFdNzpqkHcDlhrISROADXrWoZjAFH0yKtgZAQT12DJ3zpiSfBwA3qIksm6NkjpOrdaq2UADgkkFsRvrRoWQwY-lVSuR8c1N_Y_BGuhsC8cdYrC9SGbM7gseztvcG7U0Zc4yvOTdI60bYAwL6QXNjTzBBbOTASbszC9qEvHy91YpszdC8aVWKwjFmbJpi0tCI7PI2FOmaNPrOco_N9C6EkYxx9wgEnPHkv2h3IQOEMIisqLy3EI80D3hJ0k92D1q2IFpuPXwEFafk "2"), [3](https://www.google.com/goto?url=CAESlgEB6zswFa5LHcrNyOJhAf8aH2dl16pCC7o7to6CmkT-GGj3plCkE1d5ozamuzRGgFpkmUqyQzlXFL1mbhYdStsQR26nUqXYFQDKNQLEab0Uc8h9VUR4moppwVEAhWYz0Trgi09cLJbStf6Ax5xiQOE7VaXXgihC1Lrss8GnJoXA3KplVJtFlFf662TwePu6XbLFJvW6y1Y "3")
🔒 密钥管理与保护机制 (Key Wrapping)
为了防止密钥泄露,EDB 严禁 在生产环境中以明文形式直接读取 key.bin 。它通常配合以下机制工作: [1](https://www.google.com/goto?url=CAESoQEB6zswFXSoyuK2g0XDPohA_6e5_dNRvSgOkS9KALlnVSgqo7aNp6R27JeXP7S40r6C3gjwvRpQh2fk3XQmIRlpyJDqv2nXFR3Su9mjIaLZ5P4Ky0xu4S3qhsVX8tPnQQJ58y2xLOr8WUqKQZ3bQuFq2LHwGu2qlVtKHWxlcmQ1xl80V_xkx2mSu8_EaDqNSWeaJTi9mgLWG9frMUI1SVsuAg "1")
- 密钥封装 (Wrap) 与解封 (Unwrap):
在通过initdb --data-encryption初始化数据库时,需要提供解密命令。 - 启动配置:
数据库启动时,PostgreSQL 服务会调用postgresql.conf中配置的data_encryption_key_unwrap_command命令,利用密码(如 OpenSSL)或 KMS 外部密钥管理器来解开key.bin并将明文密钥载入内存。 [1](https://www.google.com/goto?url=CAESoQEB6zswFXlzLY3evrw9efD6RgURK69bg2OR_Mf-eUQ8fle_UoCxRLgIXt7IS-Bnu52w2CuBRfyltt_iPHRQZvRj8fyBOMOnAbTCXfePSTI89OX54f9p1aYyjw62cDH5j88QPlB9tNqkNW48wQVDUbB-EAGStrz9gKZBobsYbc4HmYU6BoUyiDvXrE6PkI1Gn45JHS4c4RHU4f5AWLumBK5CMQ "1"), [2](https://www.google.com/goto?url=CAESlgEB6zswFa5LHcrNyOJhAf8aH2dl16pCC7o7to6CmkT-GGj3plCkE1d5ozamuzRGgFpkmUqyQzlXFL1mbhYdStsQR26nUqXYFQDKNQLEab0Uc8h9VUR4moppwVEAhWYz0Trgi09cLJbStf6Ax5xiQOE7VaXXgihC1Lrss8GnJoXA3KplVJtFlFf662TwePu6XbLFJvW6y1Y "2"), [3](https://www.google.com/goto?url=CAESngEB6zswFXU0zNTLra9LStw45Ko2cz3ftS_8sFs1SXaqEFkT3sXJQNyvZ_5fLl2eV2eSCckZ39sbHesCAQiw1pAGj67oD76Yh4J5Gs8Gincnq6RNK42kW_jc6WI2iptSfB1HHKw13o_of4l950Jg9eqQIRhfRLTVF9QfNMh7vGaubn3vwnCBnNza120wnuXWtlERjb2j3IooSFZVpMI58Q "3")
常见初始化示例(使用 OpenSSL 密码加密):
bash
initdb --data-encryption \
--key-wrap-command='openssl enc -e -aes-128-cbc -pbkdf2 -pass pass:MyPassword -out "%p"' \
--key-unwrap-command='openssl enc -d -aes-128-cbc -pbkdf2 -pass pass:MyPassword -in "%p"' \
-D /var/lib/edb/as16/data
请谨慎使用此类代码。
(注:%p 是 EDB 内部指代 key.bin 文件路径的占位符) 。 [1](https://www.google.com/goto?url=CAESlgEB6zswFa5LHcrNyOJhAf8aH2dl16pCC7o7to6CmkT-GGj3plCkE1d5ozamuzRGgFpkmUqyQzlXFL1mbhYdStsQR26nUqXYFQDKNQLEab0Uc8h9VUR4moppwVEAhWYz0Trgi09cLJbStf6Ax5xiQOE7VaXXgihC1Lrss8GnJoXA3KplVJtFlFf662TwePu6XbLFJvW6y1Y "1"), [2](https://www.google.com/goto?url=CAESngEB6zswFXU0zNTLra9LStw45Ko2cz3ftS_8sFs1SXaqEFkT3sXJQNyvZ_5fLl2eV2eSCckZ39sbHesCAQiw1pAGj67oD76Yh4J5Gs8Gincnq6RNK42kW_jc6WI2iptSfB1HHKw13o_of4l950Jg9eqQIRhfRLTVF9QfNMh7vGaubn3vwnCBnNza120wnuXWtlERjb2j3IooSFZVpMI58Q "2")
⚠️ 运维注意事项
- 切勿丢失: 如果
key.bin损坏或丢失,且没有备份,整个数据库集簇的数据将永远无法恢复。 - 大版本升级 (
pg_upgrade): 在对启用了 TDE 的 EDB 进行大版本升级时,必须在命令中明确附带--key-unwrap-command以便程序在升级过程中迁移和读取该密钥。 [1](https://www.google.com/goto?url=CAESgAEB6zswFS4eUTLmneMrQlayEuCZf3dntE11icWPLytyimDR2F7RBZEpMTo9baC50fr1LqqZfxhIeLl7La4_0H2rsWXeQEmF19LO18DBqgRmuWBafLegd7biMQwp6OyHFUh8HZYLY1ovH5YTz1FuNPlfKbRCgEnQxF6XWudIvRDNRA "1")
请问您目前是遇到了数据库无法启动 、需要进行密钥轮转 (Key Rotation) ,还是在做 pg_upgrade 数据库升级 呢?可以告诉我具体报错或操作场景,以便为您提供针对性的命令。 [1](https://www.google.com/goto?url=CAESzgEB6zswFfao4J_K_RpJ8nI7hw5Bgs7JYLVCzq9bg3U8ExGnfrSZar1InNDQD7E7xe14jErOCNrXrdbqfBG6W2--twPLgCihXa6VkYIBmVi1LRJFlfj98--oyfYbV1jQViwvPZkkljBhdeuIQZR2YP8DiCA9fmh583aEVJqcil57xxyDf5mnDllfGEXBcVHy6c8B1cjxv6L2wTuEG6cCaagQI3mWiqPBpVSjDaGiRqUqUFv29DImYFuaLNv5dKdhldWyJcp_crTipK7qveaMWQ "1"), [2](https://www.google.com/goto?url=CAESgAEB6zswFS4eUTLmneMrQlayEuCZf3dntE11icWPLytyimDR2F7RBZEpMTo9baC50fr1LqqZfxhIeLl7La4_0H2rsWXeQEmF19LO18DBqgRmuWBafLegd7biMQwp6OyHFUh8HZYLY1ovH5YTz1FuNPlfKbRCgEnQxF6XWudIvRDNRA "2")
key.bin 在Oracle是什么
在 Oracle 数据库(以及 WebLogic、Java 等 Oracle 产品线) 中,并没有一个全局唯一的、固定叫做 key.bin 的标准系统文件。它的具体含义完全取决于您处于哪 survey 个产品或安全组件的上下文中。
以下是 key.bin 在 Oracle 相关技术栈中最常见的几种情况:
- Oracle WebLogic Server / Java 中的密码加密密钥
在 Oracle WebLogic (或基于 Java 的 Oracle 中间件)中,key.bin 通常是由开发或运维人员自定义命名的 3DES 或 AES 密钥文件。
- 作用: 用于加密/解密配置文件(如
config.xml或数据库连接池配置文件)中的敏感密码(如数据库密码、管理员密码)。 - 工作机制:
- 在 WebLogic 中,系统自带一个名为
SerializedSystemIni.dat的核心密钥。 - 但许多企业在编写自定义的脚本、使用 WLST (WebLogic Scripting Tool) 或第三方加解密工具时,会生成一个名为
key.bin的对称密钥文件,用来配合脚本在启动时解密密码。
- 在 WebLogic 中,系统自带一个名为
- Oracle 数据库透明数据加密 (TDE) 外部密钥
与 EDB 的 key.bin 类似,Oracle 数据库也有 TDE(Transparent Data Encryption) 机制,但 Oracle 官方默认的钱包(Wallet)文件叫做 ewallet.p12 或 cwallet.sso 。
- 什么时候会出现
key.bin?- 当 Oracle 数据库配置了与 外部硬/软件密钥管理系统 (KMS)、或者是通过 OCI (Oracle Cloud Infrastructure) 的 Vault 服务集成时。
- 或者是运维人员使用
openssl或外部脚本生成加密物料(Material)来封装/解封装 Oracle 钱包时,可能会将该中转文件命名为key.bin。
- Oracle GoldenGate (OGG) 的安全密钥
在 Oracle 数据同步工具 GoldenGate 中,用于加密跨网络传输数据(Trail 文件)或加密数据库密码时,需要配置一个名为 Enckeys 的文件。
- 虽然该文件默认叫
Enckeys(文本格式),但很多架构师为了安全,会通过自定义的密文生成工具将其实例化为一个二进制的key.bin文件供 OGG 进程调用。
🔍 总结与对比
| 数据库/产品 | 对应密钥文件名称 | 默认存放位置 |
|---|---|---|
| EDB Postgres | key.bin (标准官方命名) |
pg_encryption/key.bin |
| Oracle Database (TDE) | ewallet.p12 / cwallet.sso |
WALLET_ROOT 对应目录 |
| Oracle WebLogic / Java | key.bin (通常为用户自定义命名) |
用户脚本或域(Domain)安全目录 |
为了帮您更准确地定位,请问您是在 Oracle 的哪款产品 (如 数据库 、WebLogic 中间件 还是 云平台 OCI )中看到了这个文件?它目前引发了什么具体的报错 或配置问题吗?