1. 使用AES加密算法实现数据加密传输
iOS客户端(Objective-C)
- 引入加密库:可以使用
CommonCrypto
库,它是iOS系统提供的加密库。在项目中导入<CommonCrypto/CommonCrypto.h>
头文件。
- 实现AES加密函数
#import <CommonCrypto/CommonCrypto.h>
#import <UIKit/UIKit.h>
NSData *AES256Encrypt(NSData *dataToEncrypt, NSString *key) {
char keyPtr[kCCKeySizeAES256 + 1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [dataToEncrypt length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL,
[dataToEncrypt bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
- 使用加密函数
NSString *originalData = @"Hello, World!";
NSString *key = @"This is a 32 - byte key";
NSData *dataToEncrypt = [originalData dataUsingEncoding:NSUTF8StringEncoding];
NSData *encryptedData = AES256Encrypt(dataToEncrypt, key);
服务器端(以Python Flask为例,使用pycryptodome
库)
- 安装加密库:
pip install pycryptodome
- 实现AES加密函数
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
def encrypt_data(data, key):
cipher = AES.new(key.encode('utf - 8'), AES.MODE_CBC)
padded_data = pad(data.encode('utf - 8'), AES.block_size)
encrypted_data = cipher.encrypt(padded_data)
iv = base64.b64encode(cipher.iv).decode('utf - 8')
encrypted_data = base64.b64encode(encrypted_data).decode('utf - 8')
return iv + ':' + encrypted_data
- 使用加密函数
from flask import Flask
app = Flask(__name__)
original_data = "Hello, World!"
key = "This is a 32 - byte key"
encrypted_result = encrypt_data(original_data, key)
2. 密钥管理与交换
密钥生成
- 客户端:可以在应用初始化时,使用安全的随机数生成器生成密钥。例如,在iOS中可以使用
SecRandomCopyBytes
函数生成随机字节作为密钥。
NSMutableData *keyData = [NSMutableData dataWithLength:kCCKeySizeAES256];
int status = SecRandomCopyBytes(kSecRandomDefault, [keyData length], keyData.mutableBytes);
if (status == errSecSuccess) {
NSString *key = [[NSString alloc] initWithData:keyData encoding:NSUTF8StringEncoding];
}
- 服务器端:同样可以使用系统提供的安全随机数生成函数。在Python中,可以使用
os.urandom
生成随机字节作为密钥。
import os
key = os.urandom(32)
密钥交换
- 基于证书的密钥交换(常用方法)
- 服务器端:服务器生成一对公私钥,并将公钥放入数字证书中。数字证书由可信的证书颁发机构(CA)签名。
- 客户端:客户端在连接服务器时,首先验证服务器的数字证书。如果证书有效,客户端从证书中提取服务器的公钥。
- 密钥协商:客户端使用服务器的公钥加密一个随机生成的对称密钥(如AES密钥),并发送给服务器。服务器使用私钥解密得到对称密钥。这样,客户端和服务器就共享了一个对称密钥,用于后续的数据加密传输。
- Diffie - Hellman密钥交换
- 客户端和服务器端:双方各自生成一对公私钥。客户端和服务器交换公钥。
- 计算共享密钥:双方使用收到的对方公钥和自己的私钥,通过Diffie - Hellman算法计算出相同的共享密钥。这个共享密钥可以作为AES加密的密钥。
- 密钥存储
- 客户端:密钥可以存储在iOS的钥匙串(Keychain)中,这是一个安全的存储区域。使用
Security.framework
中的函数将密钥存储到钥匙串中。
- 服务器端:密钥应该以加密的形式存储在服务器的安全存储中,如使用操作系统提供的安全密钥存储机制,并且要严格限制对密钥存储位置的访问权限。