数据安全(Data Security)是保护数据在整个生命周期中免遭未授权访问、泄露、篡改或破坏的实践。数据是数字时代最宝贵的资产,从个人信息到企业机密,从金融交易到医疗记录,数据安全关乎个人隐私、商业利益乃至国家安全。
| 要素 | 含义 | 保护手段 |
| 机密性 | 数据仅被授权者访问 | 加密、访问控制 |
| 完整性 | 数据不被未授权篡改 | 哈希校验、数字签名 |
| 可用性 | 数据在需要时可被访问 | 备份、容灾、高可用 |
采集 → 存储 → 传输 → 处理 → 使用 → 归档 → 销毁
| 阶段 | 安全风险 | 防护措施 |
| 采集 | 过度收集、来源不可信 | 最小化收集、数据来源验证 |
| 存储 | 未授权访问、数据泄露 | 加密存储、访问控制 |
| 传输 | 窃听、篡改 | TLS 加密、端到端加密 |
| 处理 | 内存泄露、侧信道 | 安全计算环境、内存安全 |
| 使用 | 越权访问、内部威胁 | 权限管理、审计日志 |
| 归档 | 长期存储风险 | 加密归档、完整性校验 |
| 销毁 | 数据残留 | 安全擦除、密码学销毁 |
| 层次 | 说明 | 技术 |
| 传输加密 | 数据在网络中加密 | TLS、IPSec |
| 存储加密 | 数据在磁盘上加密 | 全盘加密、文件加密 |
| 字段加密 | 敏感字段单独加密 | 应用层加密 |
| 同态加密 | 密文上直接计算 | FHE |
使用同一密钥加密和解密,速度快,适合大数据量。
#![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 保证完整性 |
关键原则: 永远不要自己设计加密算法,使用经过审计的标准库。
密钥是加密系统的核心,密钥泄露等于所有加密形同虚设。
| 环节 | 说明 |
| 密钥生成 | 使用密码学安全随机数生成器(CSPRNG) |
| 密钥存储 | HSM(硬件安全模块)、KMS(密钥管理服务) |
| 密钥轮换 | 定期更换密钥,降低泄露影响 |
| 密钥分发 | Diffie-Hellman 密钥交换、KDC |
| 密钥销毁 | 安全擦除,确保不可恢复 |
| 方案 | 说明 |
| KMS | 云端密钥管理服务(AWS KMS、阿里云 KMS) |
| HSM | 硬件安全模块,密钥永不离开硬件 |
| Vault | HashiCorp Vault,开源密钥管理 |
| 信封加密 | 用主密钥加密数据密钥,数据密钥加密数据 |
| 模型 | 说明 | 应用 |
| DAC(自主访问控制) | 资源所有者决定访问权限 | 文件系统 |
| MAC(强制访问控制) | 系统强制安全等级标签 | 军事系统 |
| RBAC(基于角色) | 按角色分配权限 | 企业系统 |
| ABAC(基于属性) | 根据属性动态决策 | 复杂场景 |
每个主体仅被授予完成任务所需的最小权限,且权限应有时效性。
#![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() }
}
}
}
| 概念 | 说明 |
| 认证(Authentication) | 你是谁?(身份验证) |
| 授权(Authorization) | 你能做什么?(权限控制) |
| MFA(多因子认证) | 结合密码+手机+生物特征 |
| OAuth 2.0 | 授权框架(第三方登录) |
| OIDC | 基于 OAuth 2.0 的认证协议 |
| JWT | 无状态令牌(JSON Web Token) |
对敏感数据进行变形处理,使其在不影响使用的前提下无法还原原始信息。
| 技术 | 说明 | 示例 |
| 掩码 | 部分隐藏 | 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
}
在查询结果中加入精心设计的噪声,使得攻击者无法确定任何个体是否在数据集中。
$$\text{Pr}[M(D) \in S] \leq e^{\epsilon} \cdot \text{Pr}[M(D’) \in S]$$
其中 $\epsilon$ 是隐私预算,越小隐私保护越强。
| 技术 | 说明 |
| k-匿名 | 每条记录至少与 k-1 条记录在准标识符上不可区分 |
| l-多样性 | 在 k-匿名基础上,每个等价类中敏感属性至少有 l 个不同值 |
| t-接近性 | 敏感属性分布接近全局分布 |
| 法规 | 地区 | 要点 |
| GDPR | 欧盟 | 数据主体权利、数据保护影响评估、被遗忘权 |
| CCPA | 美国加州 | 消费者知情权、删除权、拒绝出售权 |
| PIPL | 中国 | 个人信息保护法,明确处理规则和跨境传输 |
| 《数据安全法》 | 中国 | 数据分类分级保护、重要数据出境安全评估 |
#![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
}
}
| 环节 | 说明 |
| 签名 | 用私钥对数据哈希加密 |
| 验签 | 用公钥解密签名,比对哈希 |
提供身份认证、完整性和不可抵赖性。
#![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 |
| 对称/非对称 | 非对称 | 对称 |
| 不可抵赖 | 是 | 否 |
| 第三方验证 | 可以 | 不可以 |
| 计算速度 | 慢 | 快 |
| 策略 | 说明 |
| 全量备份 | 备份所有数据 |
| 增量备份 | 仅备份自上次备份后变化的数据 |
| 差异备份 | 仅备份自上次全量备份后变化的数据 |
| 原则 | 说明 |
| 3 份副本 | 至少保留 3 份数据 |
| 2 种介质 | 存储在 2 种不同介质上 |
| 1 份异地 | 至少 1 份存放在异地 |
| 指标 | 含义 |
| RPO(恢复点目标) | 可接受的最大数据丢失量 |
| RTO(恢复时间目标) | 可接受的最大服务中断时间 |
灾难发生
|
|<-- RPO -->| 可丢失的数据量
| |
| 最近备份点
|
|<-------- RTO --------->| 恢复服务的时间
| 措施 | 说明 |
| 加密存储 | 透明数据加密(TDE)或字段级加密 |
| 访问控制 | 最小权限的数据库账户 |
| 审计日志 | 记录所有数据访问和修改操作 |
| 网络隔离 | 数据库不暴露公网,仅内网访问 |
| 注入防护 | 参数化查询,禁止拼接 SQL |
| 数据脱敏 | 对非生产环境数据进行脱敏 |
#![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()
}
}
}
#![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 |
- 字段加密实践:用 Rust 实现一个用户记录结构,对手机号和邮箱进行 AES-256-GCM 加密存储,解密时验证完整性。
- 数据脱敏器:实现一个脱敏工具,支持多种脱敏策略(掩码、替换、哈希),对不同类型数据(手机号、身份证、邮箱)自动选择策略。
- 密钥管理设计:设计一个信封加密方案:主密钥存于 KMS,数据密钥用于加密数据,分析密钥轮换流程。
- 差分隐私模拟:在一个数据集上实现拉普拉斯机制添加噪声,分析不同隐私预算 ε 对数据可用性的影响。
- 备份策略设计:为一个电商系统设计数据备份方案,确定 RPO/RTO 目标,选择全量/增量/差异备份的组合策略。
- 合规分析:对照 PIPL 或 GDPR,分析一个应用的个人信息处理流程,找出合规风险并提出改进建议。