
1) 【一句话结论】采用端到端加密存储(国密AES-256)+细粒度权限控制(RBAC+ABAC,基于角色与数据标签的映射)+全链路审计日志(记录操作时间、用户、数据ID、操作前状态),确保数据安全与合规。
2) 【原理/概念讲解】
老师口吻:同学们,处理涉密数据的核心是“防未授权访问+可追溯”。
3) 【对比与适用场景】
| 对比维度 | 加密算法 | 权限模型 |
|---|---|---|
| 加密算法 | 对称加密(如AES-256)<br>定义:加密和解密使用同一密钥<br>特性:加密速度快,适合大量数据<br>使用场景:数据库存储加密<br>注意点:密钥管理复杂 | RBAC(基于角色的访问控制)<br>定义:用户通过角色获得权限<br>特性:角色是静态的,权限集中管理<br>使用场景:静态角色场景(如部门角色)<br>注意点:可能权限过粗 |
| 非对称加密(如RSA)<br>定义:加密和解密使用不同密钥<br>特性:适合密钥交换,安全性高<br>使用场景:密钥分发<br>注意点:加密速度慢,适合少量数据 | ABAC(基于属性的访问控制)<br>定义:权限基于用户属性和数据属性<br>特性:动态授权,更细粒度<br>使用场景:动态场景(如按项目、部门、权限级别)<br>注意点:属性管理复杂 |
4) 【示例】
数据库设计(伪代码):
-- 数据表设计
CREATE TABLE geology_data (
id INT PRIMARY KEY,
data_label VARCHAR(50), -- 数据标签(如“勘探”、“钻探”)
encrypted_data VARBINARY(1000), -- 加密后的数据(使用AES-256)
created_at TIMESTAMP,
updated_at TIMESTAMP
);
CREATE TABLE user_roles (
user_id INT,
role_name VARCHAR(50),
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE role_permissions (
role_name VARCHAR(50),
permission_name VARCHAR(50),
data_label VARCHAR(50), -- 角色对数据标签的权限
FOREIGN KEY (role_name) REFERENCES user_roles(role_name)
);
CREATE TABLE audit_log (
log_id INT PRIMARY KEY,
user_id INT,
operation_type VARCHAR(20), -- "INSERT", "UPDATE", "DELETE", "SELECT"
data_id INT,
operation_time TIMESTAMP,
operation_before JSON, -- 操作前的数据状态(JSON格式)
operation_after JSON, -- 操作后的数据状态(JSON格式)
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- 加密存储流程(伪代码)
def encrypt_data(data, key):
# 使用SM4加密数据
encrypted_data = sm4_encrypt(data, key)
# 使用SM2生成公钥/私钥对,将公钥存入数据库
public_key = sm2_generate_public_key()
return encrypted_data, public_key
def store_data(data, data_label, user_id):
# 生成加密密钥(随机生成)
encryption_key = generate_random_key()
# 加密数据
encrypted_data, public_key = encrypt_data(data, encryption_key)
# 存储加密数据和公钥
insert_into_geology_data(encrypted_data, data_label, encryption_key, public_key, user_id)
# 记录审计日志
log_audit(user_id, "INSERT", data_id, data, data_label)
def query_data(user_id, data_label):
# 查询数据标签匹配的数据
data_row = select_from_geology_data(data_label)
if data_row:
# 获取加密密钥(从数据库中根据数据ID获取)
encryption_key = get_encryption_key(data_row.id)
# 使用SM2私钥解密公钥
private_key = sm2_generate_private_key()
# 解密数据
decrypted_data = sm2_decrypt(public_key, private_key, data_row.encrypted_data)
return decrypted_data
return None
5) 【面试口播版答案】
“面试官您好,针对涉密地质勘查数据的数据库加密存储和细粒度权限控制,我的核心思路是采用端到端加密+细粒度权限模型+全链路审计,具体来说:
首先,加密存储方面,我们选择国密算法(如SM4对称加密+SM2非对称加密),数据在写入数据库前先加密,密文存入数据库,读取时通过用户私钥解密,确保数据在存储和传输过程中安全。
其次,权限控制采用RBAC+ABAC混合模型:RBAC通过角色(如“勘探部分析师”)分配权限(如“读取标签为‘钻探’的数据”),ABAC则根据用户属性(部门、角色级别)和数据属性(项目、标签)动态授权,实现更细粒度的控制,比如不同勘探项目的数据只能被对应项目的分析师访问。
最后,审计日志实现全链路记录,包括操作时间、用户ID、操作类型(增删改查)、操作前后的数据状态(JSON格式),并存储在独立的安全日志表中,定期备份,确保可追溯和合规。
这样设计既能保障数据安全,又能满足细粒度权限和审计要求。”
6) 【追问清单】
7) 【常见坑/雷区】