面试题答案
一键面试避免内存相关安全问题
- 使用安全的数据类型:在 Swift 中,使用
SecureBytes
类型来处理敏感数据,例如密码。SecureBytes
会将数据存储在安全的内存区域,防止数据被意外泄露。 - 及时清理内存:在使用完敏感数据后,手动将其从内存中清除。可以通过将包含敏感数据的变量设置为
nil
,并调用autoreleasepool
来确保内存被及时释放。 - 避免数据拷贝:尽量减少对敏感数据的拷贝操作,因为每次拷贝都可能增加数据泄露的风险。如果必须进行拷贝,确保在拷贝完成后立即清理原始数据。
引入 CryptoSwift 库
- 使用 CocoaPods 引入:
- 在项目根目录下创建一个
Podfile
文件(如果没有的话)。 - 在
Podfile
中添加以下内容:
- 在项目根目录下创建一个
platform :ios, '10.0'
use_frameworks!
target 'YourTargetName' do
pod 'CryptoSwift'
end
- 然后在终端中执行`pod install`命令,安装完成后,使用`.xcworkspace`文件打开项目。
2. 关键配置:
- 确保项目的Build Settings
中的Enable Bitcode
设置为No
,因为某些第三方库可能不支持 Bitcode。
关键代码片段实现 AES 加密
import CryptoSwift
class User {
var encryptedPassword: [UInt8]?
func encryptPassword(_ password: String, key: String) {
guard let passwordData = password.data(using:.utf8),
let keyData = key.data(using:.utf8) else {
return
}
do {
let encrypted = try AES(key: keyData, blockMode: CBC(iv: keyData), padding:.pkcs7).encrypt(passwordData)
encryptedPassword = encrypted
} catch {
print("Encryption error: \(error)")
}
}
}
// 使用示例
let user = User()
let password = "yourPassword"
let key = "yourEncryptionKey"
user.encryptPassword(password, key: key)
if let encrypted = user.encryptedPassword {
print("Encrypted password: \(encrypted.map { String(format: "%02hhx", $0) }.joined())")
}
在上述代码中,User
类包含一个存储加密后密码的属性encryptedPassword
。encryptPassword
方法接受用户密码和加密密钥,使用CryptoSwift
库中的AES
类进行加密,并将加密结果存储在encryptedPassword
中。注意密钥长度需符合 AES 算法要求,这里简单示例使用与密钥长度匹配的 IV(实际应用中应使用随机生成的 IV 并安全存储)。同时要注意处理加密过程中可能抛出的错误。