数据存储常用的方式有 NSUserDefaults, KeyChain 以及 CoreData 等,在特定条件下,这些方式都不安全。
NSUserDefaults
NSUserDefaults 是明文存储的,路径参考iOS-目录结构。
例如,百度地图的 NSUserDefaults 文件路径:
直接打开,可以看到所有信息:
Keychain
KeyChain 的数据在越狱设备上,是可被导出的,方式如下:
安装 Keychain Dumper
Keychain Dumper 是一款可以导出 Keychain 数据的开源工具。
下载完成后,将其安装到设备的 tmp 目录下,并修改其权限:
1 | cd /tmp |
修改 Keychain 数据库权限
Keychain 数据库路径为:
1 | /private/var/Keychains/keychain-2.db |
修改其权限为可读:
1 | cd /private/var/Keychains/ |
导出 Keychain 数据
执行命令:
1 | cd /tmp |
可以看到所有的 Keychain 数据都被导出了,包括 Wifi 密码:
也包括知乎的历史数据:
CoreData
CoreData 的持久化存储类型有以下几种:
1 | COREDATA_EXTERN NSString * const NSSQLiteStoreType API_AVAILABLE(macosx(10.4),ios(3.0)); |
除了指定类型,还需要指定存储文件的路径,例如 Sqlite:
1 | _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; |
由于沙盒机制,因此 CoreData 的存储文件只能储存在有限的几个目录下,参考iOS-目录结构,因此其是可获取的,并且是明文的,并不安全。