面试题答案
一键面试整体流程
- 密钥生成:
- RSA密钥:使用Security框架生成RSA密钥对,公钥用于服务器加密数据,私钥由客户端保存用于解密。例如,使用
SecKeyGeneratePair
函数生成密钥对。 - AES密钥:随机生成一个AES密钥,此密钥用于对称加密实际传输的数据。可以使用
arc4random
等函数生成随机数作为AES密钥。
- RSA密钥:使用Security框架生成RSA密钥对,公钥用于服务器加密数据,私钥由客户端保存用于解密。例如,使用
- 数据传输前处理:
- 客户端:
- 客户端生成AES密钥,用服务器的RSA公钥加密AES密钥。
- 使用生成的AES密钥对要发送的数据进行AES加密。
- 计算加密后数据的哈希值(如SHA - 256),以保证数据完整性。
- 将加密后的AES密钥、加密后的数据以及哈希值发送给服务器。
- 服务器:
- 用自己的RSA私钥解密得到AES密钥。
- 使用AES密钥解密接收到的数据。
- 计算解密后数据的哈希值,并与接收到的哈希值进行对比,验证数据完整性。
- 客户端:
- 数据传输后处理:
- 服务器响应:服务器按照类似流程对响应数据进行处理,即生成新的AES密钥,用客户端的RSA公钥加密AES密钥,用AES密钥加密响应数据,计算哈希值,然后将加密后的AES密钥、加密后的数据和哈希值发送回客户端。
- 客户端处理响应:客户端用自己的RSA私钥解密AES密钥,用AES密钥解密响应数据,计算哈希值验证完整性。
安全风险及应对措施
- 密钥泄露风险:
- 风险:如果RSA私钥或AES密钥泄露,攻击者可以解密通信数据。
- 应对措施:
- 对RSA私钥进行严格的权限管理,存储在安全的密钥存储区(如Keychain),并且设置访问权限,只有授权的应用部分可以访问。
- 定期更新AES密钥,减少密钥泄露后造成的影响范围。
- 中间人攻击风险:
- 风险:攻击者可能拦截通信,篡改数据或者替换密钥。
- 应对措施:
- 对服务器进行证书验证,在建立连接时,验证服务器证书的合法性,防止中间人伪造服务器。可以使用
NSURLSession
的didReceiveChallenge
代理方法进行证书验证。 - 除了哈希验证数据完整性外,还可以使用数字签名。服务器用自己的私钥对数据进行签名,客户端用服务器的公钥验证签名,确保数据未被篡改。
- 对服务器进行证书验证,在建立连接时,验证服务器证书的合法性,防止中间人伪造服务器。可以使用
- 哈希碰撞风险:
- 风险:理论上存在不同数据产生相同哈希值的可能(哈希碰撞),攻击者可能利用此伪造数据。
- 应对措施:选择安全性高的哈希算法,如SHA - 256等,其哈希碰撞的概率极低。并且结合其他验证手段,如数字签名等,提高数据完整性验证的可靠性。