1

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

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 密钥并将其存储在钥匙串中并使用它而不是密码?

编辑:我根据 Rob Napier 的回答将上面生成密码的方式从使用NSProcessInfo类更改为使用类。RNCryptor除此之外,我仍然很想知道使用密码而不是 AES 密钥的一般策略是否正确和安全。

4

2 回答 2

2

这不是选择密码的好方法。globallyUniqueString在它的许多位上都是可以预测的。最好使用类似RNCryptor.randomDataOfLength生成所需长度的 blob(32 字节是理想的),然后对其进行 base-64 编码以获得密码。

使用randomDataOfLength来生成密钥实际上并不会更安全,但它会更快(取决于设备,如果这对您很重要,可以缩短 10 毫秒)。一般来说,我建议使用密码界面,除非您遇到特殊问题,密钥特别有用。正确使用密钥有点困难。

于 2016-02-18T14:57:03.873 回答
1

这些库使用的实际加密密钥来自密码,如果你使用一个,但是,IIRC,加盐所以它本质上并不安全。

对这些库提供的理论安全级别存在担忧(请参阅如何在 php 中使用 AES-256-CBC 进行正确的身份验证并正确加密数据?),但您必须对此做出判断。要记住的是,RNCryptor 是一组库(可能在不同的实现中发布了攻击向量)和一致的格式,如果您想跨平台移动加密数据,这很有用。

就个人而言,我更愿意为每次加密使用唯一的随机 AES 密钥并存储使用存储在钥匙串中的 RSA 加密的密钥。

于 2016-02-22T12:20:43.533 回答