有些開發(fā)者不太喜歡把數(shù)據(jù)保存到Keychain中,因為實現(xiàn)起來不那么直觀。不過,把信息保存到Keychain中可能是非越獄設(shè)備上最安全的一種保存數(shù)據(jù)的方式了。而在越獄設(shè)備上,沒有任何事情是安全的。這篇文章展 示了使用一個簡單的wrapper類,把數(shù)據(jù)保存到keychain是多么的簡單。使用這個wrapper來保存數(shù)據(jù)到keychain就像把數(shù)據(jù)保存到 NSUserDefaults那么簡單。下面就是一段把字符串保存到keychain的代碼。請注意和使用NSUserDefaults的語法非常類似。
PDKeychainBindings *bindings =[PDKeychainBindings sharedKeychainBindings];
[bindings setObject:@"XYZ"forKey:@"authToken"];
下面是一段從keychain中取數(shù)據(jù)的代碼。
PDKeychainBindings *bindings =[PDKeychainBindings sharedKeychainBindings];
NSLog(@"Auth token is %@",[bindings objectForKey:@"authToken"]]);
正如之前討論過的那樣,沒有任何信息在越獄設(shè)備上是安全的。攻擊者能夠拿到Plist文件,導(dǎo)出整個keychain,替換方法實現(xiàn),并且攻擊者能做他想做的任何事情。不過開發(fā)者能夠使用一些小技巧來使得腳本小子從應(yīng)用獲得信息變得更難。比如把文件加密放到本地設(shè)備上。這里這篇文章詳細的討論了這一點?;蛘吣憧梢?b>使得攻擊者更難理解你的信息。比如考慮要把某個用戶的認證令牌(authentication token)保存到keychain當(dāng)中,腳本小子可能就會導(dǎo)出keychain中的這個數(shù)據(jù),然后試圖劫持用戶的會話。我們只需再把這個認證令牌字符串反轉(zhuǎn)一下(reverse),然后再保存到keychain中,那么攻擊者就不太可能會知道認證令牌是反轉(zhuǎn)保存的。當(dāng)然,攻擊者可以追蹤你的應(yīng)用的每一個調(diào)用,然后理解到這一點,但是,一個如此簡單的技術(shù)就能夠讓腳本小子猜足夠的時間,以至于他們會開始尋找其它應(yīng)用的漏洞。另一個簡單技巧就是在每個真正的值保存之前都追加一個常量字符串。
在接下來的文章里,我們將討論使用GDB進行運行時分析。