在处理敏感数据时,密文传输和加密存储是确保数据安全的关键措施。以下是完整的加密流程和相关算法设计实现。
1. 加密流程
1.1 密文传输
-
客户端:
- 生成对称密钥(如AES密钥)。
- 使用对称密钥加密敏感数据。
- 使用服务器的公钥加密对称密钥。
- 将加密后的对称密钥和密文发送到服务器。
-
服务器:
- 使用私钥解密对称密钥。
- 使用对称密钥解密密文,获取原始数据。
1.2 加密存储
-
数据加密:
- 使用对称密钥(如AES密钥)加密敏感数据。
- 将密文存储到数据库或文件中。
-
密钥管理:
- 使用密钥管理服务(如AWS KMS、Hashicorp Vault)存储对称密钥。
- 或使用主密钥加密对称密钥,并将加密后的对称密钥与密文一起存储。
2. 相关算法设计
2.1 对称加密算法
- AES(Advanced Encryption Standard):
- 密钥长度:128位、192位或256位。
- 模式:CBC(Cipher Block Chaining)、GCM(Galois/Counter Mode)。
- 特点:安全性高,性能好,适合加密大量数据。
2.2 非对称加密算法
- RSA(Rivest-Shamir-Adleman):
- 密钥长度:2048位或4096位。
- 特点:安全性高,适合加密小数据(如对称密钥)。
2.3 哈希算法
- SHA-256:
- 用于生成数据摘要,确保数据完整性。
2.4 密钥派生算法
- PBKDF2(Password-Based Key Derivation Function 2):
- 用于从密码生成密钥,增加破解难度。
3. 实现示例
3.1 Python 示例
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad
import base64
# 生成 RSA 密钥对
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
# 客户端:加密数据
def encrypt_data(data, public_key):
# 生成对称密钥
symmetric_key = get_random_bytes(32)
# 使用对称密钥加密数据
cipher_aes = AES.new(symmetric_key, AES.MODE_CBC)
ct_bytes = cipher_aes.encrypt(pad(data.encode(), AES.block_size))
iv = base64.b64encode(cipher_aes.iv).decode('utf-8')
ct = base64.b64encode(ct_bytes).decode('utf-8')
# 使用 RSA 公钥加密对称密钥
cipher_rsa = PKCS1_OAEP.new(RSA.import_key(public_key))
encrypted_key = base64.b64encode(cipher_rsa.encrypt(symmetric_key)).decode('utf-8')
return encrypted_key, iv, ct
# 服务器:解密数据
def decrypt_data(encrypted_key, iv, ct, private_key):
# 使用 RSA 私钥解密对称密钥
cipher_rsa = PKCS1_OAEP.new(RSA.import_key(private_key))
symmetric_key = cipher_rsa.decrypt(base64.b64decode(encrypted_key))
# 使用对称密钥解密数据
iv_bytes = base64.b64decode(iv)
ct_bytes = base64.b64decode(ct)
cipher_aes = AES.new(symmetric_key, AES.MODE_CBC, iv=iv_bytes)
pt = unpad(cipher_aes.decrypt(ct_bytes), AES.block_size).decode('utf-8')
return pt
# 示例
data = "This is a sensitive message."
encrypted_key, iv, ct = encrypt_data(data, public_key)
print("Encrypted Key:", encrypted_key)
print("IV:", iv)
print("Ciphertext:", ct)
decrypted_data = decrypt_data(encrypted_key, iv, ct, private_key)
print("Decrypted Data:", decrypted_data)
3.2 C 示例(使用 OpenSSL)
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/rand.h>
#include <openssl/aes.h>
#include <stdio.h>
#include <string.h>
// 生成 RSA 密钥对
RSA* generate_rsa_key() {
RSA *rsa = RSA_new();
BIGNUM *e = BN_new();
BN_set_word(e, RSA_F4);
RSA_generate_key_ex(rsa, 2048, e, NULL);
BN_free(e);
return rsa;
}
// 加密数据
void encrypt_data(const char* data, RSA* public_key, unsigned char** encrypted_key, int* encrypted_key_len, unsigned char* iv, unsigned char* ciphertext) {
// 生成对称密钥
unsigned char symmetric_key[32];
RAND_bytes(symmetric_key, sizeof(symmetric_key));
// 使用对称密钥加密数据
AES_KEY aes_key;
AES_set_encrypt_key(symmetric_key, 256, &aes_key);
RAND_bytes(iv, AES_BLOCK_SIZE);
AES_cbc_encrypt((unsigned char*)data, ciphertext, strlen(data) + 1, &aes_key, iv, AES_ENCRYPT);
// 使用 RSA 公钥加密对称密钥
*encrypted_key = (unsigned char*)malloc(RSA_size(public_key));
*encrypted_key_len = RSA_public_encrypt(sizeof(symmetric_key), symmetric_key, *encrypted_key, public_key, RSA_PKCS1_OAEP_PADDING);
}
// 解密数据
void decrypt_data(unsigned char* encrypted_key, int encrypted_key_len, unsigned char* iv, unsigned char* ciphertext, RSA* private_key, char** decrypted_data) {
// 使用 RSA 私钥解密对称密钥
unsigned char symmetric_key[32];
RSA_private_decrypt(encrypted_key_len, encrypted_key, symmetric_key, private_key, RSA_PKCS1_OAEP_PADDING);
// 使用对称密钥解密数据
AES_KEY aes_key;
AES_set_decrypt_key(symmetric_key, 256, &aes_key);
*decrypted_data = (char*)malloc(strlen((char*)ciphertext) + 1);
AES_cbc_encrypt(ciphertext, (unsigned char*)*decrypted_data, strlen((char*)ciphertext) + 1, &aes_key, iv, AES_DECRYPT);
}
int main() {
// 生成 RSA 密钥对
RSA* rsa = generate_rsa_key();
// 加密数据
const char* data = "This is a sensitive message.";
unsigned char* encrypted_key;
int encrypted_key_len;
unsigned char iv[AES_BLOCK_SIZE];
unsigned char ciphertext[256];
encrypt_data(data, rsa, &encrypted_key, &encrypted_key_len, iv, ciphertext);
// 解密数据
char* decrypted_data;
decrypt_data(encrypted_key, encrypted_key_len, iv, ciphertext, rsa, &decrypted_data);
printf("Decrypted Data: %s\n", decrypted_data);
// 释放资源
free(encrypted_key);
free(decrypted_data);
RSA_free(rsa);
return 0;
}
4. 最佳实践
-
密钥管理:
- 使用密钥管理服务(如AWS KMS、Hashicorp Vault)存储对称密钥。
- 定期轮换密钥,减少密钥泄露的风险。
-
数据完整性:
- 使用哈希算法(如SHA-256)生成数据摘要,确保数据在传输和存储过程中未被篡改。
-
性能优化:
- 使用对称加密算法(如AES)加密大量数据,使用非对称加密算法(如RSA)加密对称密钥。
-
安全性:
- 避免使用弱加密算法(如MD5、DES)。
- 使用安全的随机数生成器(如
/dev/urandom
、RAND_bytes
)生成密钥。
通过以上设计和实现,可以确保敏感数据在传输和存储过程中的安全性。