iOS-Security[10]-数据存储

数据存储常用的方式有 NSUserDefaults, KeyChain 以及 CoreData 等,在特定条件下,这些方式都不安全。

NSUserDefaults

NSUserDefaults 是明文存储的,路径参考iOS-目录结构

例如,百度地图的 NSUserDefaults 文件路径:

iOS-Security-Data-UserDefault.png

直接打开,可以看到所有信息:

iOS-Security-Data-UserDefault-View.png

Keychain

KeyChain 的数据在越狱设备上,是可被导出的,方式如下:

安装 Keychain Dumper

Keychain Dumper 是一款可以导出 Keychain 数据的开源工具。

下载完成后,将其安装到设备的 tmp 目录下,并修改其权限:

1
2
cd /tmp
chmod a+x keychain_dumper

修改 Keychain 数据库权限

Keychain 数据库路径为:

1
/private/var/Keychains/keychain-2.db

修改其权限为可读:

1
2
cd /private/var/Keychains/ 
chmod +r keychain-2.db

导出 Keychain 数据

执行命令:

1
2
cd /tmp
./keychain_dumper

可以看到所有的 Keychain 数据都被导出了,包括 Wifi 密码:

iOS-Security-Data-Keychain-Wifi

也包括知乎的历史数据:

iOS-Security-Data-Keychain-Zhihu

CoreData

CoreData 的持久化存储类型有以下几种:

1
2
3
4
COREDATA_EXTERN NSString * const NSSQLiteStoreType API_AVAILABLE(macosx(10.4),ios(3.0));
COREDATA_EXTERN NSString * const NSXMLStoreType API_AVAILABLE(macosx(10.4)) API_UNAVAILABLE(ios);
COREDATA_EXTERN NSString * const NSBinaryStoreType API_AVAILABLE(macosx(10.4),ios(3.0));
COREDATA_EXTERN NSString * const NSInMemoryStoreType API_AVAILABLE(macosx(10.4),ios(3.0));

除了指定类型,还需要指定存储文件的路径,例如 Sqlite:

1
2
3
4
5
6
7
8
9
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];

NSURL *sqliteURL = [NSURL URLWithString:@".../CoreDataDemo.sqlite"];
NSError *error;
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:sqliteURL
options:nil
error:&error];

由于沙盒机制,因此 CoreData 的存储文件只能储存在有限的几个目录下,参考iOS-目录结构,因此其是可获取的,并且是明文的,并不安全。