使用AES加密算法进行数据加密和解密
- 导入必要的框架:在Objective-C项目中,使用AES加密通常需要导入
CommonCrypto/CommonCryptor.h
框架,该框架提供了通用的加密和哈希函数。
#import <CommonCrypto/CommonCryptor.h>
- 加密数据:以下是一个使用AES - 256(256位密钥)进行加密的示例代码。
NSData *encryptData(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;
}
- 解密数据:相应的解密代码如下。
NSData *decryptData(NSData *dataToDecrypt, NSString *key) {
char keyPtr[kCCKeySizeAES256 + 1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [dataToDecrypt length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
keyPtr,
kCCKeySizeAES256,
NULL,
[dataToDecrypt bytes],
dataLength,
buffer,
bufferSize,
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer);
return nil;
}
管理加密密钥以确保安全性
- 密钥生成:
- 避免使用容易猜测的密钥,应使用随机数生成器生成高强度的密钥。可以使用
SecRandomCopyBytes
函数来生成随机字节作为密钥。
NSMutableData *keyData = [NSMutableData dataWithLength:kCCKeySizeAES256];
int status = SecRandomCopyBytes(kSecRandomDefault, [keyData length], [keyData mutableBytes]);
if (status == 0) {
NSString *key = [[NSString alloc] initWithData:keyData encoding:NSUTF8StringEncoding];
// 保存或使用密钥
}
- 密钥存储:
- 钥匙串(Keychain):在iOS应用中,钥匙串是存储敏感信息(如加密密钥)的推荐方式。可以使用
Security.framework
中的函数将密钥安全地存储在钥匙串中。例如,使用SecItemAdd
函数将密钥添加到钥匙串。
NSDictionary *keyAttributes = @{
(id)kSecClass : (id)kSecClassKey,
(id)kSecAttrKeyType : (id)kSecAttrKeyTypeAES,
(id)kSecAttrApplicationTag : @"com.example.app.key",
(id)kSecValueData : keyData
};
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)keyAttributes, NULL);
- 服务器端存储:将密钥存储在安全的服务器端,应用在需要时从服务器获取密钥。服务器需要采取严格的安全措施,如访问控制、传输加密(使用HTTPS等)。
- 密钥传输:
- 如果需要在设备之间传输密钥,应使用安全的通道,如TLS加密的网络连接。避免在未加密的网络中明文传输密钥。
- 密钥更新:
- 定期更新加密密钥,以降低密钥泄露带来的风险。当更新密钥时,确保所有相关的物联网设备和应用都能安全地获取新密钥并进行相应的配置。