iOS keychain 是一个相对独立的空间,保存到keychain钥匙串中的信息不会因为卸载/重装app而丢失, 。相对于NSUserDefaults、plist文件保存等一般方式,keychain保存更为安全。所以我们会用keyChain保存一些私密信息,比如密码、证书、设备唯一码(把获取到用户设备的唯一ID 存到keychain 里面这样卸载或重装之后还可以获取到id,保证了一个设备一个ID)等等 keychain是用SQLite进行存储的。用苹果的话来说是一个专业的数据库,加密我们保存的数据,可以通过metadata(attributes)进行高效的搜索。keychain适合保存一些比较小的数据量的数据,如果要保存大的数据,可以考虑文件的形式存储在磁盘上,在keychain里面保存解密这个文件的密钥。
Keychain 结构是由 key-value 组成. 多个 key-value 标签的作用 : 表明该钥匙的唯一性. 当我们对 Keychain 进行操作时, 就可以定义一个包含该 key-value 字典, 调用API, 对 Keychain 进行操作
2.1 Keychain 增 / 删 / 改 / 查
主要API
/** 添加 */ OSStatus SecItemAdd(CFDictionaryRef attributes, CFTypeRef * __nullable CF_RETURNS_RETAINED result); /** 查询 */ OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef * __nullable CF_RETURNS_RETAINED result); /** 更新 */ OSStatus SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate); /** 删除 */ OSStatus SecItemDelete(CFDictionaryRef query);Keychain 并不是十分安全,在越狱的设备上,可以通过一些相应的工具很轻松的 dump 所有的 Keychain 数据,比如Keychain-Dumper,通过 ssh 登录设备,下载 keychain_dumper 至 /tmp 目录,然后 chmox +x keychain_dumper 赋予执行权限,直接 ./keychain_dumper > keychain_content.txt ,即可查看到相应的数据
Keychain 数据可以通过 iTunes 备份,iTunes 备份可以让用户选择是否加密备份,不加密的备份可以恢复到任何设备,而加密的备份不能恢复到其它设备。虽然 ThisDeviceOnly 类型的 Item 不会备份,但是 Item 则会备份
总而言之,考虑到 iCloud 服务器端、设备越狱等情况、甚至某些 Wi-FI 漏洞攻击,都有可能会泄露 Keychain 数据,最好是加密存储
项目需要存储用户的唯一标识符,但是由于如果用户重装APP,获取到的又会是一个新的UDID。查询了一系列资料下来,可以用Keychain进行存储UDID,然后就算重装了APP,也能从Keychain中读取出之前存储的UDID。 Keychain存储在iOS系统的内部数据库中,由系统进行管理和加密,哪怕APP被删除了,它存储在Keychain中的数据也不会被删除。
请看下一篇