iOS文件加密系统——采用RNCryptor框架进行AES加解密

一个简单快速而且足够安全的加密算法对于iOS文件加密系统至关重要,RNCryptor是一个跨语言的AES加解密工具,它的设计基于苹果操作系统提供的CommonCryptor框架,采用AES-256-CBC实现对称加密,支持同步和异步使用,加解密方法调用方便,且拥有很高的加密效率。

本文介绍了RNCryptor框架的技术基础和在项目中的使用方法。

RNCryptor

以基于密码的加密过程为例,可以了解到RNCryptor的工作原理:
(1)首先生成一个随机的盐用于密钥;
(2)把用户设置的密码作为一个字符串传递给相应的函数,除此之外还有步骤(1)中生成的随机加密盐、10000轮迭代设置和SHA-1 PRF设置,使用PBKDF2生成一个32字节的加密密钥;
(3)再生成一个随机的盐用于HMAC;
(4)同样使用PBKDF2,把密码、HMAC盐、10000轮迭代和SHA-1 PRF作为设置参数传入,生成一个HMAC密钥;
(5)生成一个随机IV;
(6)使用上面生成的加密密钥、AES-256 CBC方法加密数据,产生密文;
(7)把头部、密文、HMAC密钥和SHA-256 PRF传递给HMAC函数产生HMAC;
(8)把以上所有产生的内容放入RNCryptor v3数据格式中,具体如图所示。
RNCryptor数据格式

用户输入的密码通常较短,不能直接使用它作为加密密钥,否则会有极大的被攻击的风险。要做的是首先给用户设置的密码加盐,也即添加随机数据,这样即使用相同的密码加密了相同的数据,产生的密文仍然是不同的。然后使用PBKDF2对密钥进行散列处理,这个方法相当于密码扩展,可以得到密钥需要的长度(在这里是32字节)。这样产生的内容才可以作为CommonCryptor中CCCryptor()方法的密钥,因此RNCryptor相当于提供了封装好的加盐和散列方法来快速并正确地使用CommonCryptor框架中的加密方法

RNCryptor框架使用方法

可以将RNCryptor编译打包为静态库文件,也可以将源文件直接拖进需要使用的项目中。以后者为例,将RNCryptor-objc项目中的“RNCryptor”以及“RNCryptor iOS”两个目录作为Group放进项目文件夹中,如下图红色方框所示。

另外需要修改RNCryptor iOS目录下的头文件RNCryptor iOS.h中的引入头文件的格式,由原来的尖括号改为双引号,如下图白色方框所示。(同C和C++,尖括号引入的是系统库文件,而双引号引入的是工程本地的文件。使用双引号时,如果本地未找到该头文件,会自动寻找系统库目录。)

RNCryptor的使用

在其他文件中使用到RNCryptor时只需引入“RNCryptor iOS.h”头文件即可。

加密方法调用:

NSData *data = [NSData dataWithContentsOfFile:filePath];
NSError *error;
NSData *encryptedData = [RNEncryptor encryptData:data
                                      withSettings:kRNCryptorAES256Settings
                                      password:password
                                      error:&error];

解密方法调用:

NSData *decryptedData = [RNDecryptor decryptData:data
                                      withPassword:password
                                      error:&error];

加解密方法的输入输出均是NSData类型数据,需要注意使用过程中编码方式的选择。

项目地址和参考内容

RNCryptor的GitHub项目地址:
RNCryptor

本文中采用的Objective-C版本:
RNCryptor – Objective-C

参考内容:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注