MST

星途 面试题库

面试题:Objective-C网络安全与加密

在Objective-C的网络通信场景下,为防止数据被窃取或篡改,需要对传输数据进行加密。请详细说明如何结合常见的加密算法(如AES)实现数据的加密传输,并且描述在客户端和服务器端如何进行密钥管理与交换,以确保安全性。
49.6万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

1. 使用AES加密算法实现数据加密传输

iOS客户端(Objective-C)

  1. 引入加密库:可以使用CommonCrypto库,它是iOS系统提供的加密库。在项目中导入<CommonCrypto/CommonCrypto.h>头文件。
  2. 实现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;
}
  1. 使用加密函数
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库)

  1. 安装加密库pip install pycryptodome
  2. 实现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
  1. 使用加密函数
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. 密钥管理与交换

密钥生成

  1. 客户端:可以在应用初始化时,使用安全的随机数生成器生成密钥。例如,在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];
}
  1. 服务器端:同样可以使用系统提供的安全随机数生成函数。在Python中,可以使用os.urandom生成随机字节作为密钥。
import os
key = os.urandom(32)

密钥交换

  1. 基于证书的密钥交换(常用方法)
    • 服务器端:服务器生成一对公私钥,并将公钥放入数字证书中。数字证书由可信的证书颁发机构(CA)签名。
    • 客户端:客户端在连接服务器时,首先验证服务器的数字证书。如果证书有效,客户端从证书中提取服务器的公钥。
    • 密钥协商:客户端使用服务器的公钥加密一个随机生成的对称密钥(如AES密钥),并发送给服务器。服务器使用私钥解密得到对称密钥。这样,客户端和服务器就共享了一个对称密钥,用于后续的数据加密传输。
  2. Diffie - Hellman密钥交换
    • 客户端和服务器端:双方各自生成一对公私钥。客户端和服务器交换公钥。
    • 计算共享密钥:双方使用收到的对方公钥和自己的私钥,通过Diffie - Hellman算法计算出相同的共享密钥。这个共享密钥可以作为AES加密的密钥。
  3. 密钥存储
    • 客户端:密钥可以存储在iOS的钥匙串(Keychain)中,这是一个安全的存储区域。使用Security.framework中的函数将密钥存储到钥匙串中。
    • 服务器端:密钥应该以加密的形式存储在服务器的安全存储中,如使用操作系统提供的安全密钥存储机制,并且要严格限制对密钥存储位置的访问权限。