北京理工大学/数达安全联合研究团队

一、加密需求

为保证本文内容连贯、落地性强,本文设定统一加密需求:业务系统需将用户核心敏感数据(手机号、身份证号)存入MySQL数据库,全程防止数据泄露、篡改、勒索窃取,同时区分不同层级访问权限。需通过数据库全链路11个加密点位实现数据加密存储、传输、展示防护,每种技术独立落地该需求,配套原理讲解、场景适配、伪代码示例。

核心约束:敏感字段为 user_phoneuser_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为代表的企业也在主推第三代技术。

Logo

免费领 150 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐