11种数据库加密原理详解与代码实现
北京理工大学/数达安全联合研究团队
一、加密需求
为保证本文内容连贯、落地性强,本文设定统一加密需求:业务系统需将用户核心敏感数据(手机号、身份证号)存入MySQL数据库,全程防止数据泄露、篡改、勒索窃取,同时区分不同层级访问权限。需通过数据库全链路11个加密点位实现数据加密存储、传输、展示防护,每种技术独立落地该需求,配套原理讲解、场景适配、伪代码示例。
核心约束:敏感字段为 user_phone、user_id_card,数据库表 user_info,需实现数据落盘加密、权限可控、防泄露、防勒索,各加密方式保留自身技术特性差异。
二、业务数据表结构与测试数据
本文所有加密技术落地、伪代码测试均基于统一的user_info 用户信息表,表中包含用户姓名、身份证号、手机号三类业务数据,其中身份证号、手机号为核心敏感加密字段,以下为MySQL表结构及5行可示例测试数据。
|
字段名 |
数据类型 |
是否非空 |
是否主键 |
字段说明 |
|
id |
INT UNSIGNED |
是 |
是 |
用户唯一ID,自增主键 |
|
user_name |
VARCHAR(50) |
是 |
否 |
用户真实姓名(非敏感字段) |
|
user_id_card |
CHAR(18) |
是 |
否 |
用户身份证号(核心敏感加密字段) |
|
user_phone |
CHAR(11) |
是 |
否 |
用户手机号(核心敏感加密字段) |
|
create_time |
DATETIME |
是 |
否 |
数据创建时间,默认当前时间 |
示例测试数据如下:
|
id |
user_name |
user_id_card |
user_phone |
create_time |
|
1 |
张三 |
110101199001011234 |
13800138000 |
2025-01-01 10:00:00 |
|
2 |
李四 |
310101199202021234 |
13900139000 |
2025-01-02 11:00:00 |
|
3 |
王五 |
440101199503031234 |
13700137000 |
2025-01-03 12:00:00 |
|
4 |
赵六 |
510101199804041234 |
13600136000 |
2025-01-04 13:00:00 |
|
5 |
孙七 |
330101200005051234 |
13500135000 |
2025-01-05 14:00:00 |
三、11种数据库加密技术详解
1. 硬盘加密(硬件/磁盘软件加密)
1.1 技术原理
属于数据库最底层物理存储加密,直接对数据库所在物理磁盘、逻辑分区进行全盘加密。加密解密由硬件磁盘固件或系统磁盘加密软件自动完成,对数据库管理系统(MySQL、Oracle等)、业务应用完全透明。数据库读写数据时,无需感知加密逻辑,磁盘层自动完成明文写入加密、密文读取解密。

1.2 安全特性
仅防护磁盘丢失、物理硬盘被盗导致的数据泄露;系统内拥有磁盘访问权限的用户、进程均可直接读取数据库明文文件;无法抵御勒索病毒、无法控制数据库账号、应用账号权限。
1.3 落地实现
将存放MySQL数据文件的磁盘分区全盘加密,业务正常写入用户手机号、身份证号,磁盘层自动加密落盘,数据库无感知。
1.4 伪代码示例
// 硬盘加密(硬件/磁盘软件加密)
// 底层硬件/系统级加密,无业务侵入,C++风格模拟磁盘AES-256加解密逻辑
#include <string>
#include <cstdint>
// 磁盘硬件唯一加密密钥
std::string disk_key = "硬件磁盘唯一加密密钥/系统磁盘密钥";
// 磁盘写入加密:明文落盘自动加密
std::uint8_t* disk_encrypt(const std::uint8_t* raw_data, int data_len, const std::string& key)
{
// 底层磁盘固件自动AES-256-CBC加密
// 此处为标准C++模拟实现
return aes256_cbc_encrypt(raw_data, data_len, (std::uint8_t*)key.c_str());
}
// 磁盘读取解密:读取数据自动解密,上层完全透明
std::uint8_t* disk_decrypt(const std::uint8_t* encrypt_data, int data_len, const std::string& key)
{
return aes256_cbc_decrypt(encrypt_data, data_len, (std::uint8_t*)key.c_str());
}
// 业务层正常写入数据库(零改造)
int main()
{
// 业务插入明文敏感数据
db_execute_sql("INSERT INTO user_info(user_phone,user_id_card) VALUES ('13800138000','110101199001011234')");
// 底层磁盘自动加密落盘,读取时系统自动解密返回明文
return 0;
}
2. 存储加密网关
2.1 技术原理
专为网络存储场景设计(NAS、分布式网络存储),部署在服务器与网络存储设备之间,通过拦截NFS、SMB、iSCSI等存储通讯协议,在数据库文件读写网络传输过程中,自动完成加密、解密操作,对数据库和应用透明。

2.2 安全特性
安全能力与硬盘加密持平,仅防止网络存储设备丢失、传输窃听导致的数据泄露;无法限制系统用户、数据库账号访问权限,无法抵御勒索病毒。
2.3 落地实现
MySQL数据文件存放于NAS网络存储,通过存储加密网关拦截文件读写请求,敏感数据文件上传加密、下载解密。
2.4 伪代码示例
// 存储加密网关 C++ 核心实现
#include <string>
#include <cstdint>
// 存储网关固定加密密钥
std::string gateway_key = "storage_gateway_aes256_key";
// 拦截NAS/网络存储写入请求,文件加密后落盘
std::uint8_t* storage_write_intercept(const std::uint8_t* file_data, int len)
{
// 网关层AES-256加密
return aes256_encrypt(file_data, len, (std::uint8_t*)gateway_key.c_str());
}
// 拦截网络存储读取请求,密文解密后返回数据库
std::uint8_t* storage_read_intercept(const std::uint8_t* encrypt_data, int len)
{
return aes256_decrypt(encrypt_data, len, (std::uint8_t*)gateway_key.c_str());
}
int main()
{
// 数据库原生无改造,正常写入明文数据
db_execute_sql("INSERT INTO user_info(user_phone,user_id_card) VALUES ('13800138000','110101199001011234')");
// 网关拦截写入:加密存入NAS
// 网关拦截读取:解密返回明文给数据库
return 0;
}
3. 文件加密
3.1 技术原理
针对数据库数据文件、索引文件、日志文件单独加密,区别于全盘硬盘加密,精准加密数据库核心文件。通过文件加密软件锁定指定数据库文件,操作系统层级管控文件访问权限,数据库本身无感知,加密解密过程独立于数据库运行。
3.2 安全特性
兼顾防磁盘丢失泄露、防OS非法用户/进程访问数据库文件、可抵御勒索病毒篡改加密数据库文件;无数据库账号权限管控能力,数据库合法账号可正常读取明文数据。
3.3 落地实现
对MySQL的.ibd数据文件、.frm索引文件进行加密锁定,禁止非授权系统进程访问,合法数据库进程可正常读写。
3.4 伪代码示例
// 文件加密 C++ 精准加密实现(仅加密数据库核心文件)
#include <string>
#include <vector>
std::string file_encrypt_key = "db_file_aes256_key";
// 锁定MySQL核心数据文件
std::vector<std::string> target_db_files = {
"/mysql/data/user_info.ibd",
"/mysql/data/user_info.frm"
};
// 数据库文件加密 + 权限锁定
void db_file_encrypt(const std::string& file_path)
{
// 1. 读取明文文件
std::string raw_file = read_file(file_path);
// 2. AES加密覆盖原文件
std::string encrypt_data = aes256_encrypt(raw_file, file_encrypt_key);
write_file(file_path, encrypt_data);
// 3. 系统权限管控:仅mysqld进程可访问
set_file_permission(file_path, "mysqld");
}
// 授权进程读取自动解密
std::string db_file_decrypt(const std::string& file_path)
{
std::string encrypt_data = read_file(file_path);
return aes256_decrypt(encrypt_data, file_encrypt_key);
}
int main()
{
// 业务正常写入数据
db_execute_sql("INSERT INTO user_info(user_phone,user_id_card) VALUES ('13800138000','110101199001011234')");
// 后台线程自动加密数据库文件,拦截非法进程访问
for (auto& path : target_db_files) {
db_file_encrypt(path);
}
return 0;
}
4. OS扩展加密
4.1 技术原理
基于操作系统驱动、HOOK钩子机制,拦截数据库进程的文件读写请求、数据库客户端对数据库的读写请求。在OS层对数据库落地数据自动加密存储,同时根据登录数据库的账号权限判定是否返回解密明文,实现OS+数据库双层权限管控。

4.2 安全特性
可抵御非授权数据库文件读写、勒索病毒;可管控数据库账号访问权限。无法识别、管控上层业务内应用账号。
4.3 落地实现
对MySQL的.ibd数据文件、.frm索引文件进行加密锁定,禁止非授权系统进程访问,合法数据库进程可正常读写。
对MySQL客户端访问进行拦截,禁止非授权数据库用户访问,合法数据库用户可正常读写。
4.4 伪代码示例
// OS扩展加密(文件读写+账号权限管控)C++实现
#include <string>
#include <unordered_map>
std::string os_encrypt_key = "os_hook_db_key";
// 数据库账号权限映射表
std::unordered_map<std::string, bool> db_user_perm = {
{"admin", true},
{"guest", false}
};
// 拦截数据库写入:统一加密落盘
std::string hook_db_write(const std::string& raw_data)
{
return aes256_encrypt(raw_data, os_encrypt_key);
}
// 拦截读取:根据账号权限返回明文/拦截
std::string hook_db_read(const std::string& db_user, const std::string& encrypt_data)
{
if (db_user_perm[db_user]) {
return aes256_decrypt(encrypt_data, os_encrypt_key);
}
return "权限不足,无法读取敏感数据";
}
int main()
{
// 场景1:有权账号读写
db_login("admin", "******");
db_execute_sql("INSERT INTO user_info(user_phone,user_id_card) VALUES ('13800138000','110101199001011234')");
std::string res1 = db_query("SELECT * FROM user_info");
std::cout << hook_db_read("admin", res1) << std::endl; // 明文
// 场景2:无权账号读取被拦截
db_login("guest", "******");
std::string res2 = db_query("SELECT * FROM user_info");
std::cout << hook_db_read("guest", res2) << std::endl; // 权限拦截
return 0;
}
5. 数据库自带加密
5.1 技术原理
数据库原生源码级加密能力(MySQL TDE透明数据加密、Oracle透明加密),数据库内核层面实现数据落盘加密,无需依赖系统、硬件、中间件,数据库自身完成加密解密逻辑,原生支持数据库账号权限管控。

5.2 安全特性
原生管控数据库账号访问权限,兼容性强、稳定性高;无法抵御勒索病毒攻击,病毒可直接加密数据库密文文件,导致数据丢失;难以替换国密算法。
5.3 落地实现
开启MySQL原生TDE加密,对user_info表开启透明加密,数据库内核自动完成敏感字段加密落盘,基于数据库账号控制访问权限。
5.4 伪代码示例
// 数据库原生TDE加密 C++ 模拟实现
#include <string>
// 数据库主密钥
std::string tde_master_key = "mysql_native_tde_key";
// 模拟数据库TDE内核加密开关
void enable_tde_encryption()
{
// 开启内核透明加密插件
db_exec_dsl("ENABLE_TDE_ENCRYPTION;");
db_exec_dsl("SET GLOBAL tde_master_key = ?", tde_master_key);
// 业务表开启加密
db_exec_dsl("ALTER TABLE user_info ENCRYPTION = 'Y';");
}
int main()
{
enable_tde_encryption();
// 业务无感知写入,内核自动加密落盘
db_execute_sql("INSERT INTO user_info(user_phone,user_id_card) VALUES ('13800138000','110101199001011234')");
// 有权限账号查询自动解密返回明文
std::string res = db_query("SELECT user_phone,user_id_card FROM user_info");
std::cout << res << std::endl;
// 无权限账号直接拦截(数据库原生权限控制)
db_switch_user("guest");
std::string deny_res = db_query("SELECT * FROM user_info");
std::cout << deny_res << std::endl; // 拒绝访问
return 0;
}
6. 库内扩展加密
6.1 技术原理
基于数据库原生扩展能力(视图、触发器、存储过程、密文索引)实现字段级透明加密,无需改造外部系统,纯库内逻辑实现:数据插入时通过触发器自动加密,查询时通过视图自动解密,依托扩展索引实现密文检索。

6.2 安全特性
精准管控数据库用户对加密字段的访问权限;仅Oracle等少数数据库完善支持密文索引,MySQL支持较弱;加密解密依赖库内组件,且密文索引性能远低于原生索引,对数据库性能损耗较大。
6.3 落地实现
创建触发器实现手机号、身份证号字段入库自动加密。创建解密视图实现查询透明解密,搭建密文索引支持模糊检索。
6.4 伪代码示例
// 库内扩展字段加密 C++ 模拟触发器+视图逻辑
#include <string>
std::string db_ext_key = "oracle_field_aes_key";
// 模拟入库触发器:字段自动加密
void trigger_field_encrypt(std::string& phone, std::string& id_card)
{
phone = aes256_encrypt(phone, db_ext_key);
id_card = aes256_encrypt(id_card, db_ext_key);
}
// 模拟查询视图:字段自动解密
void view_field_decrypt(std::string& phone, std::string& id_card)
{
phone = aes256_decrypt(phone, db_ext_key);
id_card = aes256_decrypt(id_card, db_ext_key);
}
int main()
{
// 1. 模拟插入触发加密
std::string phone = "13800138000";
std::string id_card = "110101199001011234";
trigger_field_encrypt(phone, id_card);
db_execute_sql("INSERT INTO user_info(user_phone,user_id_card) VALUES (?,?)", phone, id_card);
//更新密文索引
update_cipher_index();
// 2. 模拟视图查询解密
auto row = db_query_row("SELECT user_phone,user_id_card FROM user_info");
view_field_decrypt(row.phone, row.id_card);
std::cout << row.phone << " " << row.id_card << std::endl;
}
7. 数据库加密网关
7.1 技术原理
部署在应用与数据库之间的独立网关,拦截所有SQL访问请求(增删改查),在网关层完成敏感字段的加密、解密、权限校验,对上层应用、底层数据库实现透明加密。

7.2 安全特性
可精细化管控数据库账号访问权限;不支持库内触发器、视图、存储过程等原生功能的透明适配,网关转发会产生性能损耗,整体性能偏低。
7.3 落地实现
数据库网关拦截应用SQL写入请求,识别手机号、身份证号字段并加密后入库;拦截查询请求,解密后返回明文数据;基于数据库账号管控访问权限。
7.4 伪代码示例
// 数据库加密网关 C++ 拦截器核心逻辑
#include <string>
#include <vector>
std::string db_gateway_key = "db_gateway_aes256_key";
std::vector<std::string> sensitive_fields = {"user_phone", "user_id_card"};
// 网关统一SQL拦截入口
std::string gateway_sql_intercept(const std::string& sql, const std::string& db_user)
{
// 1. 校验数据库账号权限
if (!check_db_user_perm(db_user)) {
return "数据库账号权限不足";
}
// 2. 写入SQL:加密敏感字段
if (sql.substr(0, 6) == "INSERT") {
auto params = parse_sql_params(sql, sensitive_fields);
for (auto& p : params) {
p.value = aes256_encrypt(p.value, db_gateway_key);
}
std::string new_sql = replace_sql_params(sql, params);
return db_execute_sql(new_sql);
}
// 3. 查询SQL:解密返回明文
if (sql.substr(0, 6) == "SELECT") {
auto cipher_result = db_query(sql);
auto plain_result = decrypt_result_fields(cipher_result, sensitive_fields, db_gateway_key);
return plain_result;
}
return db_execute_sql(sql);
}
int main()
{
// 网关透明代理读写
gateway_sql_intercept("INSERT INTO user_info(user_phone,user_id_card) VALUES ('13800138000','110101199001011234')", "admin");
std::string res = gateway_sql_intercept("SELECT * FROM user_info", "admin");
std::cout << res << std::endl;
return 0;
}
8. 数据库连接驱动加密
8.1 技术原理
基于数据库访问驱动扩展(JDBC、AOP、MyBatis切面)实现加密,无需部署独立网关,通过改写数据库连接驱动、新增切面拦截逻辑,在应用与数据库的连接层完成数据加密解密,核心特性与数据库加密网关一致。
8.2 安全特性
权限管控能力与加密网关一致,轻量化无独立网关;不支持库内原生组件适配,存在较大性能损耗,改造量小于应用全量加密。但是会导致数据库原生索引、函数、存储过程等机制失效。
8.3 落地实现(统一需求)
扩展JDBC驱动,拦截Java应用的数据库读写请求,自动对手机号、身份证号加密入库、解密返回。
8.4 伪代码示例
// JDBC驱动扩展加密 C++ 切面实现
#include <string>
#include <map>
std::string jdbc_encrypt_key = "jdbc_driver_encrypt_key";
// 前置切面:拦截写入参数加密
void jdbc_insert_aspect(std::map<std::string, std::string>& params)
{
if (params.count("user_phone")) {
params["user_phone"] = aes256_encrypt(params["user_phone"], jdbc_encrypt_key);
}
if (params.count("user_id_card")) {
params["user_id_card"] = aes256_encrypt(params["user_id_card"], jdbc_encrypt_key);
}
}
// 后置切面:拦截查询结果解密
void jdbc_query_aspect(std::vector<std::map<std::string, std::string>>& result_list)
{
for (auto& row : result_list) {
if (row.count("user_phone")) {
row["user_phone"] = aes256_decrypt(row["user_phone"], jdbc_encrypt_key);
}
if (row.count("user_id_card")) {
row["user_id_card"] = aes256_decrypt(row["user_id_card"], jdbc_encrypt_key);
}
}
}
int main()
{
// 模拟业务JDBC写入
std::map<std::string, std::string> params;
params["user_phone"] = "13800138000";
params["user_id_card"] = "110101199001011234";
jdbc_insert_aspect(params);
jdbc_execute("INSERT INTO user_info(user_phone,user_id_card) VALUES (?,?)", params);
// 模拟业务JDBC查询
auto res_list = jdbc_query("SELECT * FROM user_info");
jdbc_query_aspect(res_list);
return 0;
}
9. 应用加密
9.1 技术原理
业务应用层原生加密,无任何底层、中间件依赖,在业务代码中主动调用加密算法、密钥管理工具,实现敏感数据加密后入库、查询后解密,同时自主实现密文检索、应用账号权限管控。

9.2 安全特性
可精准管控应用层账号访问权限,安全粒度细;需要大幅改造业务代码,开发、维护成本极高,属于高安全高改造成本方案;数据库原生索引失效,性能成忧;采用确定性加密会降低安全性。
9.3 落地实现
业务系统代码中手动加密手机号、身份证号,加密密文存入数据库,查询时根据应用用户权限解密数据。
9.4 伪代码示例
// 应用层加密 C++ 完整权限+加解密逻辑
#include <string>
#include <unordered_map>
std::string app_encrypt_key = "business_app_aes_key";
std::unordered_map<std::string, bool> app_user_perm = {
{"super_admin", true},
{"user", false}
};
// 业务写入:权限校验+主动加密入库
int save_user_data(const std::string& phone, const std::string& id_card, const std::string& app_user)
{
if (!app_user_perm[app_user]) {
std::cout << "应用账号无操作权限" << std::endl;
return -1;
}
// 应用层主动加密
std::string enc_phone = aes256_encrypt(phone, app_encrypt_key);
std::string enc_id = aes256_encrypt(id_card, app_encrypt_key);
// 密文入库
db_execute_sql("INSERT INTO user_info(user_phone,user_id_card) VALUES (?,?)", enc_phone, enc_id);
return 0;
}
// 业务查询:权限校验+主动解密
std::map<std::string, std::string> get_user_data(const std::string& app_user)
{
auto cipher_data = db_query_row("SELECT * FROM user_info");
if (!app_user_perm[app_user]) {
return {{"msg", "应用账号无查看权限"}};
}
// 解密返回明文
cipher_data["user_phone"] = aes256_decrypt(cipher_data["user_phone"], app_encrypt_key);
cipher_data["user_id_card"] = aes256_decrypt(cipher_data["user_id_card"], app_encrypt_key);
return cipher_data;
}
int main()
{
save_user_data("13800138000", "110101199001011234", "super_admin");
auto admin_res = get_user_data("super_admin");
auto user_res = get_user_data("user");
std::cout << "管理员查看:" << admin_res["user_phone"] << std::endl;
std::cout << "普通用户查看:" << user_res["msg"] << std::endl;
return 0;
}
10. 应用代理加密
10.1 技术原理
也称作CASB实现方式,在业务应用前端部署独立代理程序,所有用户请求、数据流转均经过代理层,在数据进入应用系统前完成加密,数据返回前端前完成解密。应用、数据库全程仅接触密文,无任何明文数据留存。
10.2 安全特性
安全性极高,真实明文对应用、数据库完全透明;无法支持加密数据检索,业务适配复杂度极高,透明性差、落地受限多。
10.3 落地实现
用户提交的手机号、身份证号先经过应用代理加密,密文传入应用、存入数据库;前端查询数据时,代理解密后返回明文,应用全程无明文。
10.4 伪代码示例
// 应用代理加密 C++ 拦截逻辑
#include <string>
#include <map>
std::string app_proxy_key = "app_proxy_secure_key";
// 前置拦截:用户明文数据 -> 代理加密 -> 应用/数据库密文
std::map<std::string, std::string> proxy_before_save(const std::map<std::string, std::string>& submit_data)
{
std::map<std::string, std::string> cipher_data = submit_data;
cipher_data["user_phone"] = aes256_encrypt(cipher_data["user_phone"], app_proxy_key);
cipher_data["user_id_card"] = aes256_encrypt(cipher_data["user_id_card"], app_proxy_key);
// 密文传入应用、存入数据库
app_receive_data(cipher_data);
db_insert_map(cipher_data);
return cipher_data;
}
// 后置拦截:数据库密文 -> 代理解密 -> 前端明文展示
std::map<std::string, std::string> proxy_after_query(const std::map<std::string, std::string>& cipher_data)
{
std::map<std::string, std::string> plain_data;
plain_data["user_phone"] = aes256_decrypt(cipher_data["user_phone"], app_proxy_key);
plain_data["user_id_card"] = aes256_decrypt(cipher_data["user_id_card"], app_proxy_key);
return plain_data;
}
int main()
{
// 用户前端明文提交
std::map<std::string, std::string> user_input = {
{"user_phone", "13800138000"},
{"user_id_card", "110101199001011234"}
};
// 代理加密流转
auto cipher_res = proxy_before_save(user_input);
std::cout << "应用接收密文:" << cipher_res["user_phone"] << std::endl;
// 代理解密展示
auto plain_res = proxy_after_query(cipher_res);
std::cout << "前端展示明文:" << plain_res["user_phone"] << std::endl;
return 0;
}
11. 终端加密
11.1 技术原理
全链路最前端加密方案,依托终端安全控件(浏览器插件、客户端控件、APP安全SDK),用户在终端输入数据的瞬间完成加密,加密密文传输至应用、数据库,全程传输、存储无明文;数据展示时,仅终端控件可解密展示明文。
11.2 安全特性
理论最高安全性,明文仅存在于用户终端输入瞬间;完全不透明,业务适配难度、开发难度最大,全链路无任何明文泄露风险。
11.3 落地实现
用户在客户端输入手机号、身份证号,终端SDK即时加密,密文传输至应用和数据库,仅终端控件可解密展示,链路全程密文流转。
11.4 伪代码示例
// 终端加密 C++ SDK 全链路实现
#include <string>
#include <map>
// 终端独立安全密钥(仅终端SDK持有)
std::string terminal_secure_key = "user_terminal_sdk_key";
// 终端输入瞬间加密:明文不落地、不传输
std::map<std::string, std::string> terminal_input_encrypt(const std::string& phone, const std::string& id_card)
{
std::map<std::string, std::string> cipher_data;
cipher_data["user_phone"] = aes256_encrypt(phone, terminal_secure_key);
cipher_data["user_id_card"] = aes256_encrypt(id_card, terminal_secure_key);
return cipher_data;
}
// 终端本地解密:仅终端可展示明文
std::map<std::string, std::string> terminal_show_decrypt(const std::map<std::string, std::string>& cipher_data)
{
std::map<std::string, std::string> plain_data;
plain_data["user_phone"] = aes256_decrypt(cipher_data["user_phone"], terminal_secure_key);
plain_data["user_id_card"] = aes256_decrypt(cipher_data["user_id_card"], terminal_secure_key);
return plain_data;
}
int main()
{
// 1. 终端输入即时加密
auto cipher_data = terminal_input_encrypt("13800138000", "110101199001011234");
// 2. 全链路密文传输、存储
app_receive_data(cipher_data);
db_insert_map(cipher_data);
// 3. 服务端/数据库全程无明文
std::cout << "数据库存储密文:" << cipher_data["user_phone"] << std::endl;
// 4. 仅终端解密展示明文
auto plain_data = terminal_show_decrypt(cipher_data);
std::cout << "终端展示明文:" << plain_data["user_phone"] << std::endl;
return 0;
}
四、11种加密技术核心能力对比总结
|
加密方式 |
防磁盘泄露 |
防勒索病毒 |
数据库账号管控 |
应用账号管控 |
密文检索支持 |
改造难度 |
安全性 |
|
硬盘加密 |
✅ |
❌ |
❌ |
❌ |
✅ |
极低 |
低 |
|
存储加密网关 |
✅ |
❌ |
❌ |
❌ |
✅ |
极低 |
低 |
|
文件加密 |
✅ |
✅ |
❌ |
❌ |
✅ |
低 |
中低 |
|
OS扩展加密 |
✅ |
✅ |
✅ |
❌ |
✅ |
很低 |
很高 |
|
数据库自带加密 |
✅ |
❌ |
✅ |
❌ |
✅ |
极低 |
高 |
|
库内扩展字段加密 |
✅ |
❌ |
✅ |
❌ |
差 |
中 |
高 |
|
数据库加密网关 |
✅ |
❌ |
✅ |
❌ |
差 |
中高 |
高 |
|
连接驱动加密 |
✅ |
❌ |
✅ |
❌ |
差 |
中高 |
高 |
|
应用加密 |
✅ |
❌ |
❌ |
✅ |
差 |
极高 |
高 |
|
应用代理加密 |
✅ |
❌ |
❌ |
✅ |
❌ |
极高 |
极高 |
|
终端加密 |
✅ |
❌ |
❌ |
✅ |
❌ |
最高 |
最高 |
五、落地选型科普建议
1. 轻量化低安全需求:优先选择硬盘加密、数据库原生加密,无代码改造、快速落地,满足基础防泄露需求;
2. 小型系统,无性能要求:选择库内扩展字段加密、数据库加密网关、连接驱动加密,安全性有保障;
3. 大型系统,兼顾合规和性能:首选OS扩展加密,平衡安全与改造成本;
4. 精细化业务权限管控需求,无性能担忧:选择应用代理加密,支持应用账号级别权限控制;
5. 极致安全、零明文留存需求:选择应用代理加密、终端加密,以牺牲易用性与性能为代价。
上述11个点是理论上存在的11个改造点,但是并不是都能够形成商品化的产品。业界已形成商业化产品的技术包括:库内扩展字段加密、数据库加密网关及连接驱动加密、OS扩展加密,它们分别被称为第一代、第二代和第三代产品。在国外,以IBM为代表的企业也在主推第三代技术。
更多推荐




所有评论(0)