📖 数据密集型设计

数据加密与安全传输

深入探讨数据加密技术与安全传输实现

一、数据加密概述

数据加密是保护数据安全的核心技术,通过将明文转换为密文,防止数据在传输和存储过程中被窃取或篡改。数据加密包括传输加密和存储加密两个方面。

二、加密算法分类

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 定期轮换密钥

定期轮换加密密钥。

九、总结

数据加密是数据安全的基础,通过传输加密和存储加密能够保护数据在传输和存储过程中的安全。合理选择加密算法、使用密钥管理服务、遵循最佳实践,能够构建安全可靠的数据密集型应用。