Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第六十一 数据安全

数据安全(Data Security)是保护数据在整个生命周期中免遭未授权访问、泄露、篡改或破坏的实践。数据是数字时代最宝贵的资产,从个人信息到企业机密,从金融交易到医疗记录,数据安全关乎个人隐私、商业利益乃至国家安全。


一、数据安全概述

1.1 数据安全的三要素

要素含义保护手段
机密性数据仅被授权者访问加密、访问控制
完整性数据不被未授权篡改哈希校验、数字签名
可用性数据在需要时可被访问备份、容灾、高可用

1.2 数据生命周期与安全

采集 → 存储 → 传输 → 处理 → 使用 → 归档 → 销毁
阶段安全风险防护措施
采集过度收集、来源不可信最小化收集、数据来源验证
存储未授权访问、数据泄露加密存储、访问控制
传输窃听、篡改TLS 加密、端到端加密
处理内存泄露、侧信道安全计算环境、内存安全
使用越权访问、内部威胁权限管理、审计日志
归档长期存储风险加密归档、完整性校验
销毁数据残留安全擦除、密码学销毁

二、数据加密

2.1 加密的层次

层次说明技术
传输加密数据在网络中加密TLS、IPSec
存储加密数据在磁盘上加密全盘加密、文件加密
字段加密敏感字段单独加密应用层加密
同态加密密文上直接计算FHE

2.2 对称加密

使用同一密钥加密和解密,速度快,适合大数据量。

#![allow(unused)]
fn main() {
use aes_gcm::{Aes256Gcm, Key, Nonce};
use aes_gcm::aead::{Aead, KeyInit};
use rand::RngCore;

fn encrypt_data(plaintext: &[u8], key: &[u8; 32]) -> Vec<u8> {
    let cipher = Aes256Gcm::new(Key::<Aes256Gcm>::from_slice(key));
    
    // 生成随机 Nonce(每次加密必须不同)
    let mut nonce_bytes = [0u8; 12];
    rand::thread_rng().fill_bytes(&mut nonce_bytes);
    let nonce = Nonce::from_slice(&nonce_bytes);
    
    let ciphertext = cipher.encrypt(nonce, plaintext).unwrap();
    
    // 将 nonce 和密文拼接存储
    let mut result = nonce_bytes.to_vec();
    result.extend(ciphertext);
    result
}

fn decrypt_data(ciphertext: &[u8], key: &[u8; 32]) -> Vec<u8> {
    let cipher = Aes256Gcm::new(Key::<Aes256Gcm>::from_slice(key));
    
    let nonce = Nonce::from_slice(&ciphertext[..12]);
    let data = &ciphertext[12..];
    
    cipher.decrypt(nonce, data).unwrap()
}
}
算法类型说明
AES-256-GCM对称+AEAD推荐,提供加密和完整性认证
ChaCha20-Poly1305对称+AEAD无硬件加速时优于 AES
AES-CBC对称需配合 HMAC 保证完整性

关键原则: 永远不要自己设计加密算法,使用经过审计的标准库。

2.3 密钥管理

密钥是加密系统的核心,密钥泄露等于所有加密形同虚设。

环节说明
密钥生成使用密码学安全随机数生成器(CSPRNG)
密钥存储HSM(硬件安全模块)、KMS(密钥管理服务)
密钥轮换定期更换密钥,降低泄露影响
密钥分发Diffie-Hellman 密钥交换、KDC
密钥销毁安全擦除,确保不可恢复
方案说明
KMS云端密钥管理服务(AWS KMS、阿里云 KMS)
HSM硬件安全模块,密钥永不离开硬件
VaultHashiCorp Vault,开源密钥管理
信封加密用主密钥加密数据密钥,数据密钥加密数据

三、访问控制

3.1 访问控制模型

模型说明应用
DAC(自主访问控制)资源所有者决定访问权限文件系统
MAC(强制访问控制)系统强制安全等级标签军事系统
RBAC(基于角色)按角色分配权限企业系统
ABAC(基于属性)根据属性动态决策复杂场景

3.2 最小权限原则

每个主体仅被授予完成任务所需的最小权限,且权限应有时效性。

#![allow(unused)]
fn main() {
// Rust 中通过类型系统实现权限隔离
mod database {
    pub struct AdminToken { _private: () }
    pub struct ReadOnlyToken { _private: () }
    
    impl AdminToken {
        pub fn delete(&self, id: u64) { /* 删除操作 */ }
        pub fn write(&self, data: &str) { /* 写入操作 */ }
    }
    
    impl ReadOnlyToken {
        pub fn read(&self, id: u64) -> String { /* 读取操作 */ String::new() }
    }
}
}

3.3 认证与授权

概念说明
认证(Authentication)你是谁?(身份验证)
授权(Authorization)你能做什么?(权限控制)
MFA(多因子认证)结合密码+手机+生物特征
OAuth 2.0授权框架(第三方登录)
OIDC基于 OAuth 2.0 的认证协议
JWT无状态令牌(JSON Web Token)

四、数据脱敏与隐私保护

4.1 数据脱敏

对敏感数据进行变形处理,使其在不影响使用的前提下无法还原原始信息。

技术说明示例
掩码部分隐藏138****8888
替换用虚构值替换真实姓名 → 随机姓名
截断删除部分数据2024-01-15 → 2024-01
泛化降低精度年龄 25 → 年龄段 20-30
扰动添加噪声工资 +随机偏移
哈希不可逆变换身份证号 → SHA-256
#![allow(unused)]
fn main() {
fn mask_phone(phone: &str) -> String {
    if phone.len() < 7 {
        return "*".repeat(phone.len());
    }
    let chars: Vec<char> = phone.chars().collect();
    let mut result = String::new();
    for (i, &c) in chars.iter().enumerate() {
        if i < 3 || i >= chars.len() - 4 {
            result.push(c);
        } else {
            result.push('*');
        }
    }
    result
}
// 13812345678 → 138****5678
}

4.2 差分隐私

在查询结果中加入精心设计的噪声,使得攻击者无法确定任何个体是否在数据集中。

$$\text{Pr}[M(D) \in S] \leq e^{\epsilon} \cdot \text{Pr}[M(D’) \in S]$$

其中 $\epsilon$ 是隐私预算,越小隐私保护越强。

4.3 匿名化技术

技术说明
k-匿名每条记录至少与 k-1 条记录在准标识符上不可区分
l-多样性在 k-匿名基础上,每个等价类中敏感属性至少有 l 个不同值
t-接近性敏感属性分布接近全局分布

4.4 隐私法规

法规地区要点
GDPR欧盟数据主体权利、数据保护影响评估、被遗忘权
CCPA美国加州消费者知情权、删除权、拒绝出售权
PIPL中国个人信息保护法,明确处理规则和跨境传输
《数据安全法》中国数据分类分级保护、重要数据出境安全评估

五、数据完整性

5.1 哈希校验

#![allow(unused)]
fn main() {
use sha2::{Sha256, Digest};

fn compute_hash(data: &[u8]) -> String {
    let mut hasher = Sha256::new();
    hasher.update(data);
    let result = hasher.finalize();
    format!("{:x}", result)
}

fn verify_integrity(data: &[u8], expected_hash: &str) -> bool {
    compute_hash(data) == expected_hash
}
}

5.2 数字签名

环节说明
签名用私钥对数据哈希加密
验签用公钥解密签名,比对哈希

提供身份认证、完整性和不可抵赖性。

5.3 消息认证码(MAC)

#![allow(unused)]
fn main() {
use hmac::{Hmac, Mac};
use sha2::Sha256;

fn compute_mac(key: &[u8], data: &[u8]) -> [u8; 32] {
    let mut mac = <Hmac<Sha256> as Mac>::new_from_slice(key).unwrap();
    mac.update(data);
    mac.finalize().into_bytes().into()
}
}
对比数字签名MAC
对称/非对称非对称对称
不可抵赖是否
第三方验证可以不可以
计算速度慢快

六、数据备份与容灾

6.1 备份策略

策略说明
全量备份备份所有数据
增量备份仅备份自上次备份后变化的数据
差异备份仅备份自上次全量备份后变化的数据

6.2 3-2-1 原则

原则说明
3 份副本至少保留 3 份数据
2 种介质存储在 2 种不同介质上
1 份异地至少 1 份存放在异地

6.3 RPO 与 RTO

指标含义
RPO(恢复点目标)可接受的最大数据丢失量
RTO(恢复时间目标)可接受的最大服务中断时间
灾难发生
  |
  |<-- RPO -->|        可丢失的数据量
  |           |
  |     最近备份点
  |
  |<-------- RTO --------->|  恢复服务的时间

七、数据库安全

7.1 数据库安全措施

措施说明
加密存储透明数据加密(TDE)或字段级加密
访问控制最小权限的数据库账户
审计日志记录所有数据访问和修改操作
网络隔离数据库不暴露公网,仅内网访问
注入防护参数化查询,禁止拼接 SQL
数据脱敏对非生产环境数据进行脱敏

7.2 字段级加密

#![allow(unused)]
fn main() {
// 对敏感字段加密后存储
struct UserRecord {
    id: u64,
    name: String,           // 明文
    phone_encrypted: Vec<u8>, // 加密存储
    email_encrypted: Vec<u8>, // 加密存储
}

impl UserRecord {
    fn new(id: u64, name: &str, phone: &str, email: &str, key: &[u8; 32]) -> Self {
        UserRecord {
            id,
            name: name.to_string(),
            phone_encrypted: encrypt_data(phone.as_bytes(), key),
            email_encrypted: encrypt_data(email.as_bytes(), key),
        }
    }
    
    fn get_phone(&self, key: &[u8; 32]) -> String {
        String::from_utf8(decrypt_data(&self.phone_encrypted, key)).unwrap()
    }
}
}

八、Rust 数据安全生态

Crate用途
aes-gcmAES-GCM 加密
chacha20poly1305ChaCha20-Poly1305 加密
sha2SHA-256/512 哈希
hmacHMAC 消息认证码
ring密码学原语库
argon2密码哈希(Argon2)
rand随机数生成
zeroize安全清除内存中的敏感数据

安全清除内存中的密钥

#![allow(unused)]
fn main() {
use zeroize::Zeroize;

fn process_secret() {
    let mut secret_key = [0u8; 32];
    // ... 使用 secret_key ...
    
    // 使用完毕后安全清除,防止内存残留
    secret_key.zeroize();
}
}

九、总结与练习

本章小结

知识点要点
安全三要素机密性、完整性、可用性
数据生命周期采集→存储→传输→处理→使用→归档→销毁
数据加密传输加密(TLS)、存储加密(AES-GCM)、字段加密
密钥管理KMS/HSM/Vault、信封加密、密钥轮换
访问控制RBAC/ABAC、最小权限、MFA、OAuth/JWT
数据脱敏掩码、替换、泛化、差分隐私、k-匿名
数据完整性哈希校验、数字签名、MAC
备份容灾3-2-1 原则、RPO/RTO
隐私法规GDPR、PIPL、《数据安全法》
Rust 生态aes-gcm、sha2、ring、zeroize

练习建议

  1. 字段加密实践:用 Rust 实现一个用户记录结构,对手机号和邮箱进行 AES-256-GCM 加密存储,解密时验证完整性。
  2. 数据脱敏器:实现一个脱敏工具,支持多种脱敏策略(掩码、替换、哈希),对不同类型数据(手机号、身份证、邮箱)自动选择策略。
  3. 密钥管理设计:设计一个信封加密方案:主密钥存于 KMS,数据密钥用于加密数据,分析密钥轮换流程。
  4. 差分隐私模拟:在一个数据集上实现拉普拉斯机制添加噪声,分析不同隐私预算 ε 对数据可用性的影响。
  5. 备份策略设计:为一个电商系统设计数据备份方案,确定 RPO/RTO 目标,选择全量/增量/差异备份的组合策略。
  6. 合规分析:对照 PIPL 或 GDPR,分析一个应用的个人信息处理流程,找出合规风险并提出改进建议。