前言
iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌。苹果自己用keychain来保存Wi-Fi网络密码,VPN凭证等等。它是一个sqlite数据库,位于/private/var/Keychains/keychain-2.db,其保存的所有数据都是加密过的。
iOS的keychain提供了一种安全的保存私密信息(密码,序列号,证书等)的方案, 但是,在越狱环境下并不安全
iPhone:/private/var/Keychains root# pwd
/private/var/Keychains
iPhone:/private/var/Keychains root# ls -lrt
total 2984
-rw------- 1 _securityd wheel 0 Jan 1 1970 caissuercache.sqlite3
-rw------- 1 _securityd wheel 69632 Nov 22 10:33 ocspcache.sqlite3
-rw------- 1 _securityd wheel 16384 Dec 1 13:37 TrustStore.sqlite3
-rw------- 1 _securityd wheel 512 Dec 4 19:39 caissuercache.sqlite3-journal
-rw------- 1 _securityd wheel 32768 Dec 5 10:20 ocspcache.sqlite3-shm
-rw------- 1 _securityd wheel 253952 Dec 5 18:44 keychain-2.db
-rw------- 1 _securityd wheel 1277232 Dec 6 16:54 ocspcache.sqlite3-wal
-rw------- 1 _securityd wheel 32768 Dec 7 14:15 keychain-2.db-shm
-rw------- 1 _securityd wheel 1367872 Dec 7 17:08 keychain-2.db-wal
Keychain的信息是存在于每个应用(app)的沙盒之外的。
通过keychain access groups可以在应用之间共享keychain中的数据。要求在保存数据到keychain的时候指定group。
把数据保存到keychain的最好方法就是用苹果提供的KeychainItemWrapper。可以到这下载例子工程。
使用 KeyChain Dumper
一个应用能够访问的keychain数据是通过其entitlements文件指定的。keychain_dumper使用一个自签名文件,带有一个*通配符的entitlments,因此它能够访问keychain中的所有条目。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>keychain-access-groups</key>
<array>
<string>*</string>
</array>
</dict>
</plist>
CER=<40 character hex string for certificate> make codesign
使用该工具,需要确保 保存在 /private/var/Keychains/keychain-2.db 的文件可以被读取。
iPhone:/var/Keychains root# chmod +x keychain-2.db
iPhone:/var/Keychains root# ls -lrt /var/Keychains/keychain-2.db
-rwx--x--x 1 _securityd wheel 253952 Dec 5 18:44 /var/Keychains/keychain-2.db*
devzkndeMacBook-Pro:Versions devzkn$ scp /Users/devzkn/Downloads/Keychain-Dumper-master/keychain_dumper iphone150://bin/keychain_dumper
If you are using the binary from Git you can attempt to dump all of the accessible password Keychain entries by simply running the tool with now flags
iPhone:/bin root# /bin/keychain_dumper
Usage
Usage: keychain_dumper [-e]|[-h]|[-agnick]
<no flags>: Dump Password Keychain Items (Generic Password, Internet Passwords)
-a: Dump All Keychain Items (Generic Passwords, Internet Passwords, Identities, Certificates, and Keys)
-e: Dump Entitlements
-g: Dump Generic Passwords
-n: Dump Internet Passwords
-i: Dump Identities
-c: Dump Certificates
-k: Dump Keys
iPhone:/bin root# /bin/keychain_dumper -e
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>keychain-access-groups</key>
<array>
<string>532LCLCWL8.com.tencent.xin</string>
<string>8H6B3SFEU4.com.ali.group</string>
<string>VG68Y2X7TH.com.taobao.taobao4iphone</string>
<string>VMSRGD9Q5D.com.alimama.moon</string>
<string>apple</string>
<string>com.apple.SharedWebCredentials</string>
<string>com.apple.apsd</string>
<string>com.apple.assistant</string>
<string>com.apple.security.sos</string>
<string>ichat</string>
</array>
</dict>
</plist>
标识符(Identifier)
在后面我们要从keychain中取数据的时候会用到。
如果你想要在应用之间共享信息,那么你需要指定访问组(access group)。有同样的访问组 的应用能够访问同样的keychain信息。
Phone:/bin root# /bin/keychain_dumper -k
Key
---
Entitlement Group: com.apple.security.sos
一个安全点的选项是kSecAttrAccessibleWhenUnlocked。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。