一、数据加密概述
数据加密是保护数据安全的核心技术,通过将明文转换为密文,防止数据在传输和存储过程中被窃取或篡改。数据加密包括传输加密和存储加密两个方面。
二、加密算法分类
2.1 对称加密
对称加密使用相同的密钥进行加密和解密:
graph TD
A[明文] --> B[加密算法]
C[密钥] --> B
B --> D[密文]
D --> E[解密算法]
C --> E
E --> F[明文]
2.2 非对称加密
非对称加密使用公钥和私钥进行加密和解密:
graph TD
A[明文] --> B[公钥加密]
C[公钥] --> B
B --> D[密文]
D --> E[私钥解密]
F[私钥] --> E
E --> G[明文]
2.3 加密算法对比
| 算法类型 | 代表算法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 对称加密 | AES, DES, 3DES | 速度快 | 密钥分发难 | 大量数据加密 |
| 非对称加密 | RSA, ECC | 安全性高 | 速度慢 | 密钥交换、数字签名 |
| 哈希算法 | MD5, SHA-256 | 不可逆 | 不能解密 | 数据校验、密码存储 |
三、传输加密(SSL/TLS)
3.1 SSL/TLS工作原理
SSL/TLS通过握手过程建立安全连接:
sequenceDiagram
participant Client as 客户端
participant Server as 服务器
Client->>Server: 1. Client Hello(支持的加密套件)
Server-->>Client: 2. Server Hello(选择加密套件、发送证书)
Client->>Server: 3. 验证证书、生成预主密钥(用服务器公钥加密)
Server->>Server: 4. 用私钥解密预主密钥
Client->>Client: 5. 生成会话密钥
Server->>Server: 6. 生成会话密钥
Client->>Server: 7. Finished(用会话密钥加密)
Server-->>Client: 8. Finished(用会话密钥加密)
3.2 TLS版本选择
| TLS版本 | 安全性 | 兼容性 | 建议 |
|---|---|---|---|
| TLS 1.0 | 低 | 高 | 禁用 |
| TLS 1.1 | 低 | 中 | 禁用 |
| TLS 1.2 | 中 | 高 | 支持 |
| TLS 1.3 | 高 | 中 | 优先使用 |
3.3 证书类型
| 证书类型 | 特点 | 适用场景 |
|---|---|---|
| DV证书 | 域名验证 | 个人网站 |
| OV证书 | 组织验证 | 企业网站 |
| EV证书 | 扩展验证 | 金融机构 |
| Wildcard证书 | 通配符域名 | 多子域名 |
3.4 Nginx SSL配置
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/certs/example.crt;
ssl_certificate_key /etc/nginx/certs/example.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
}
四、存储加密(AES)
4.1 AES算法
AES是对称加密的标准算法:
| AES类型 | 密钥长度 | 安全性 | 性能 |
|---|---|---|---|
| AES-128 | 128位 | 高 | 快 |
| AES-192 | 192位 | 更高 | 中 |
| AES-256 | 256位 | 最高 | 较慢 |
4.2 AES加密模式
| 加密模式 | 特点 | 适用场景 |
|---|---|---|
| ECB | 相同明文产生相同密文 | 不推荐 |
| CBC | 需要初始化向量(IV) | 通用 |
| GCM | 提供认证和加密 | 推荐 |
| CTR | 流加密模式 | 流媒体 |
4.3 AES加密实现
public class AesEncryptionService
{
private const int KeySize = 256;
private const int BlockSize = 128;
public byte[] Encrypt(byte[] plainText, byte[] key, byte[] iv)
{
using (Aes aes = Aes.Create())
{
aes.KeySize = KeySize;
aes.BlockSize = BlockSize;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
aes.Key = key;
aes.IV = iv;
using (ICryptoTransform encryptor = aes.CreateEncryptor())
{
return encryptor.TransformFinalBlock(plainText, 0, plainText.Length);
}
}
}
public byte[] Decrypt(byte[] cipherText, byte[] key, byte[] iv)
{
using (Aes aes = Aes.Create())
{
aes.KeySize = KeySize;
aes.BlockSize = BlockSize;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
aes.Key = key;
aes.IV = iv;
using (ICryptoTransform decryptor = aes.CreateDecryptor())
{
return decryptor.TransformFinalBlock(cipherText, 0, cipherText.Length);
}
}
}
public byte[] GenerateKey()
{
using (Aes aes = Aes.Create())
{
aes.KeySize = KeySize;
aes.GenerateKey();
return aes.Key;
}
}
public byte[] GenerateIV()
{
using (Aes aes = Aes.Create())
{
aes.GenerateIV();
return aes.IV;
}
}
}
五、数据库加密
5.1 字段级加密
对敏感字段进行加密存储:
-- 创建加密表
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50),
email_encrypted VARBINARY(256),
phone_encrypted VARBINARY(256),
iv VARBINARY(16)
);
-- 插入加密数据
INSERT INTO users (id, username, email_encrypted, phone_encrypted, iv)
VALUES (1, 'john', AES_ENCRYPT('john@example.com', 'secret_key'), AES_ENCRYPT('1234567890', 'secret_key'), RANDOM_BYTES(16));
-- 查询解密数据
SELECT id, username,
AES_DECRYPT(email_encrypted, 'secret_key') AS email,
AES_DECRYPT(phone_encrypted, 'secret_key') AS phone
FROM users WHERE id = 1;
5.2 数据库透明加密
数据库透明加密(TDE)对数据文件进行加密:
-- SQL Server TDE
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
CREATE CERTIFICATE ServerCert WITH SUBJECT = 'Server Certificate';
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER CERTIFICATE ServerCert;
ALTER DATABASE MyDatabase SET ENCRYPTION ON;
-- MySQL TDE (InnoDB)
-- 需要企业版支持
innodb_encrypt_tables = ON
innodb_encrypt_log = ON
六、密码存储
6.1 哈希算法
使用哈希算法存储密码:
public class PasswordService
{
public string HashPassword(string password)
{
byte[] salt = new byte[16];
RandomNumberGenerator.Fill(salt);
byte[] hash = Rfc2898DeriveBytes.Pbkdf2(
password,
salt,
100000,
HashAlgorithmName.SHA256,
32
);
byte[] hashBytes = new byte[48];
Array.Copy(salt, 0, hashBytes, 0, 16);
Array.Copy(hash, 0, hashBytes, 16, 32);
return Convert.ToBase64String(hashBytes);
}
public bool VerifyPassword(string password, string hashedPassword)
{
byte[] hashBytes = Convert.FromBase64String(hashedPassword);
byte[] salt = new byte[16];
Array.Copy(hashBytes, 0, salt, 0, 16);
byte[] hash = Rfc2898DeriveBytes.Pbkdf2(
password,
salt,
100000,
HashAlgorithmName.SHA256,
32
);
for (int i = 0; i < 32; i++)
{
if (hashBytes[i + 16] != hash[i])
return false;
}
return true;
}
}
6.2 密码哈希库
| 库名 | 语言 | 特点 |
|---|---|---|
| BCrypt | 多语言 | 自适应哈希 |
| Argon2 | 多语言 | 内存密集 |
| scrypt | 多语言 | 内存密集 |
| PBKDF2 | 多语言 | 标准算法 |
七、密钥管理
7.1 密钥管理原则
- 分离原则:密钥与数据分离存储
- 轮换原则:定期轮换密钥
- 最小权限:只授予必要的密钥访问权限
- 备份原则:备份密钥并安全存储
7.2 密钥管理服务
| 服务 | 提供商 | 特点 |
|---|---|---|
| AWS KMS | AWS | 云原生 |
| Azure Key Vault | Azure | 云原生 |
| HashiCorp Vault | 开源 | 通用 |
| Keycloak | 开源 | 身份认证 |
7.3 HashiCorp Vault配置
# 启动Vault
vault server -dev -dev-root-token-id="root"
# 登录Vault
vault login root
# 创建密钥
vault secrets enable transit
vault write -f transit/keys/my-key
# 加密数据
vault write transit/encrypt/my-key plaintext=$(echo -n "secret" | base64)
# 解密数据
vault write transit/decrypt/my-key ciphertext="vault:v1:..."
八、加密最佳实践
8.1 使用TLS 1.3
优先使用TLS 1.3,禁用旧版本。
8.2 使用强加密算法
使用AES-256和SHA-256及以上算法。
8.3 不要硬编码密钥
使用密钥管理服务存储密钥。
8.4 使用随机IV
每次加密使用随机初始化向量。
8.5 定期轮换密钥
定期轮换加密密钥。
九、总结
数据加密是数据安全的基础,通过传输加密和存储加密能够保护数据在传输和存储过程中的安全。合理选择加密算法、使用密钥管理服务、遵循最佳实践,能够构建安全可靠的数据密集型应用。