对于用户隐私数据需要存储到数据库中,并要对数据库进行加密,那么如何设置密钥保证数据库加密是一个至关重要的问题。

在不考虑相关黑客或白客通过逆向的情况下,我的主要策略如下: 密钥长度足够的长 如果一个数据库的密钥特别的长,就会增加破解的难度,如果长度保持在一二百位的话,暴力破解的时间会大大加长。 不同设备间密钥各不相同 虽然其他人可能破解到了一个设备的密钥,但是如果不同设备之间的密钥各不相同,那么破解了其中一个设备的密钥后,再去破解另外一个设备密钥的难度不会减少,由于iOS和macOS之间系统开发程度的不同,采取不一样的策略

系统名称| keychain说明 | 设备唯一标识说明 - | :-: | -: iOS | 可以直接进行keychain的存储,在不越狱的情况下不可以通过其他程序获取 | 涉及用户隐私,无法读取 macOS | 如果使用,弹出对话框询问用户是否允许使用,体验性差 | 可以获取到设备的UDID、设备号、Mac地址

实现

通过对以上情况进行分析,可以针对iOS设计出来随机字符串和固定字符串相结合、不同设备之间密钥各不相同、密钥长度长到难以破解的程度,针对Mac设计出来*不同设备之间密钥各不相同、密钥长度难以破解的程度,具体实现方案如下:

iOS

1、生成一个由200个拼音和数字拼接而成的随机字符串,作为temp1,存储到keychain里面 2、程序中写死一个固定字符串,作为key 3、以key为密钥将temp1进行RC4加密,生成一个新的200位的字符串temp2作为数据库密钥 在使用过程中,针对第一步先要查看本地keychain中是否存在temp1,如果存在直接进入第二步,如果不存在则重新生成。

Mac

1、将Mac设备的UDID作为key 2、程序中写死一个200位的固定字符串,作为temp1 3、按照iOS的加密策略,生成一个长度比较长的字符串,作为数据库的密钥

打开数据库后,可以通过SQL语句"SELECT name FROM sqlite_master WHERE type='table' "来判断数据库查询语句是够能够得到有效查询,如果查询有效,则表示密钥正确,继续后续的相关处理,否则密钥错误,删除当前文件,重新创建数据库进行后续的操作。