📖 数据密集型设计

数据加密与安全传输

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

一、数据加密概述

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

二、加密算法分类

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

定期轮换加密密钥。

九、总结

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