生成和保存加密和解密密码的策略

时间:2016-02-18 14:46:11

标签: ios cryptography aes keychain rncryptor

我使用RNEncryptorRNDecryptor类进行加密和解密,如下所示:

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密钥的策略是否正确和安全。

2 个答案:

答案 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加密的密钥,我会感觉更舒服。