我使用RNEncryptor
和RNDecryptor
类进行加密和解密,如下所示:
NSData *encryptedData = [RNEncryptor encryptData:input
withSettings:kRNCryptorAES256Settings
password:thePassword
error:nil];
NSData *output = [RNDecryptor decryptData:encryptedData
withSettings:kRNCryptorAES256Settings
password:thePassword
error:nil];
我第一次在应用中加密数据时,使用RNCryptor
类生成密码,如下所示:
NSData *thePasswordData = [RNCryptor randomDataOfLength:32];
NSString *thePassword = [aesPasswordData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
我将此生成的密码保存在应用程序的钥匙串中,并将其用于所有后续加密和解密。
这是加密/解密的好策略还是任何人都可以看到它的任何缺陷?我应该生成一个AES密钥并将其存储在Keychain中并使用它而不是密码吗?
修改:我更改了如何根据Rob Napier的回答使用NSProcessInfo
类使用RNCryptor
类来生成密码。除此之外,我仍然很想知道使用密码而不是AES密钥的策略是否正确和安全。
答案 0 :(得分:2)
这不是一个选择密码的好方法。 globallyUniqueString
在其许多位中都可以预测。你最好使用类似RNCryptor.randomDataOfLength
的东西来生成一个所需长度的blob(32个字节是理想的),然后base-64对它进行编码以获得密码。
使用randomDataOfLength
来生成密钥实际上不会更安全,但它会更快(根据设备的10毫秒,如果这对你很重要)。一般情况下,我建议使用密码界面,除非你有一个特别的问题,其中键特别有用。密钥只是有点难以正确使用。
答案 1 :(得分:1)
这些库使用的实际加密密钥来自密码,如果您使用密码,但是,IIRC,盐渍,因此它本质上不太安全。
关于这些图书馆提供的理论安全级别存在担忧(参见How to correctly encrypt data with proper authentication using AES-256-CBC in php?),但你必须对此作出判断。需要记住的是,RNCryptor是一组库(可能在不同的实现中发布了攻击向量)和一致的格式,如果您想跨平台移动加密数据,这将非常有用。
就个人而言,对于每次加密使用唯一的随机AES密钥并存储使用存储在钥匙串中的RSA加密的密钥,我会感觉更舒服。