[英]Implementing and Testing iOS data protection
剛剛看到了會議209 - 從2010 WWDC獲取應用數據。
主題演講解釋了許多內容,包括您可以為文件設置數據保護屬性的方式(NSFileProtectionComplete,NSFileProtectionNone)以及如何確定哪種保護最適合您的情況。
我剛剛實現了它,但無法弄清楚如何測試安全性是否開啟,任何想法?
另外,我有一個sql lite數據庫,需要不時在后台訪問,這種數據保護方法似乎不夠好..任何指導我通過最佳數據庫保護的鏈接或教程? (找到sql密碼,但在一個不變的項目中添加有點重)
謝謝!
更新:對於iOS 6,可以通過使用需要在iOS配置文件中的App ID上配置的權利來為您的應用程序提供數據保護。 我還沒有測試過,這是我能找到的最好的信息https://devforums.apple.com/message/707939#707939
我對此事的調查使我相信很難確定設備上是否啟用了數據保護。
文件保護被設置啟用NSFileProtectionKey
文件屬性為NSFileProtectionComplete
例如,要創建受保護的文件,您可以運行以下代碼:
[[NSFileManager defaultManager] createFileAtPath:[self filePath]
contents:[@"super secret file contents" dataUsingEncoding:NSUTF8StringEncoding]
attributes:[NSDictionary dictionaryWithObject:NSFileProtectionComplete
forKey:NSFileProtectionKey]];
遺憾的是,即使設備上未啟用數據保護(或者代碼在數據保護不可用的模擬器上運行),此代碼也會毫無錯誤地執行。
更糟糕的是,無論文件是否受保護,都將設置NSFileProtectionComplete
屬性。 下列:
self.fileProtectionValue = [[[NSFileManager defaultManager] attributesOfItemAtPath:[self filePath]
error:NULL] valueForKey:NSFileProtectionKey];
NSLog(@"file protection value: %@", self.fileProtectionValue);
將吐出file protection value: NSFileProtectionComplete
無論是否啟用了數據保護。
我已經能夠使用兩種方法來發現文件保護是否按預期工作。 遺憾的是,這些方法都不適合檢測是否在現場設備上啟用了數據保護。
這兩種方法都認為如果設備被鎖定,則無法讀取受保護的文件。
方法一涉及使用計時器在設備鎖定后嘗試讀取文件,但在應用程序繼續運行時:
[self performSelector:@selector(doReload) withObject:nil afterDelay:20];
- (void)doReload {
NSLog(@"protected data available: %@",[[UIApplication sharedApplication] isProtectedDataAvailable] ? @"yes" : @"no");
NSError *error;
self.fileContents = [NSString stringWithContentsOfFile:[self filePath]
encoding:NSUTF8StringEncoding
error:&error];
NSLog(@"file contents: %@\nerror: %@", self.fileContents, error);
}
如果您運行上面的代碼並鎖定受數據保護的設備,它將吐出:
protected data available: no
file contents: (null)
error: Error Domain=NSCocoaErrorDomain Code=257 "The operation couldn’t be completed. (Cocoa error 257.)" UserInfo=0x16e110 {NSFilePath=/var/mobile/Applications/D71F1F1F-6C25-4848-BB1F-51539B47EC79/Documents/protected_file, NSUnderlyingError=0x16e010 "The operation couldn’t be completed. Operation not permitted"}
20秒延遲是必要的,因為在啟用數據保護的設備被鎖定后,受保護的數據仍有10秒左右的寬限期。
第二種方法是在應用程序中創建受保護的文件,退出應用程序,鎖定設備,等待10秒,然后使用XCode管理器下載應用程序的內容。 這將產生錯誤消息,受保護的文件將為空。
如果上述任一測試無法按照所述方式運行,則表明數據保護未啟用,或者您的文件保護代碼未正確實施。
因為在將機密信息寫入磁盤之前,我沒有找到任何方法在應用程序中驗證數據保護已啟用,我已向Apple提交了一項功能增強請求,以便能夠將應用程序標記為需要啟用數據保護。 (rdar:// 10167256)
Apple確實通過其移動設備管理(MDM)API提供了解決方案,該API與第三方服務器相結合,可用於實施需要在設備上啟用數據保護的策略。
您可以使用iExplorer應用程序檢測您的文件是否已加密。 iExplorer允許您瀏覽iPhone / iPad的文件系統,並打開文件(當然您的設備必須插入Mac)。
設備鎖定時,無法正確讀取文件。
從NSFileManager類doc:
該文件以加密格式存儲在磁盤上,在設備鎖定或引導時無法讀取或寫入。
您只需在設置文件屬性時傳遞常量。
使用writeToFile:options:error:方法將NSData對象的內容寫入磁盤時,請包含NSDataWritingFileProtectionComplete選項。
使用setAttributes:ofItemAtPath:error:NSFileManager方法將NSFileProtectionKey屬性(帶有NSFileProtectionComplete值)添加到現有文件
編輯(確定受保護文件的可用性)
只有在設備解鎖時才能訪問受保護的文件。 由於應用程序可能會在設備鎖定時繼續運行,因此您的代碼應准備好處理受保護文件隨時變得不可用的可能性。 UIKit框架提供了跟蹤當前是否啟用數據保護的方法。
*
Use applicationProtectedDataWillBecomeUnavailable: and applicationProtectedDataDidBecomeAvailable: methods and use them to track changes to the availability of protected data.
*
An application can register for the UIApplicationProtectedDataWillBecomeUnavailable and UIApplicationProtectedDataDidBecomeAvailable notifications.
*
The protectedDataAvailable property of the shared UIApplication object indicates whether protected files are currently accessible.
任何使用受保護文件的應用程序都應實現應用程序委托方法。 當調用applicationProtectedDataWillBecomeUnavailable:方法時,應用程序應立即關閉所有受保護的文件,並且在調用applicationProtectedDataDidBecomeAvailable:方法之前不要再使用它們。 在受保護文件不可用時訪問受保護文件的任何嘗試都將失敗。
驗證越獄設備上的文件保護
更進一步,如果您想測試精確文件的文件保護,那么您將需要一個越獄設備。 為此,這里是(非詳細的)步驟:
1)越獄iOS設備
2)通過Cydia安裝Open SSH(這是從該設備遠程訪問文件所必需的)( https://cydia.saurik.com/openssh.html )
3)以root用戶身份從您的計算機(使用Mac客戶端或終端)登錄到您的設備。
要查找應用程序目錄和文件的位置,有多種方法。 你可以
grep
應用程序的過程(例如ps ax | grep YourAppName
) - 確保應用程序正在設備上運行以獲取進程詳細信息。 它應該給出應用程序包的位置 find
來搜索特定文件。例如。 find / -type f -name YouAppName.sqlite
。 它應該在設備上給出文件位置。 從這里開始,當手機被密碼鎖定時,您可以嘗試查看文件是否真的可訪問; 或不。 - 您只需運行cat YouAppName.sqlite
即可查看內容是否可訪問。 Ia f文件受保護,應該顯示
不允許操作
錯誤; 否則如果顯示文件的內容。
同樣,如果您真的想檢查單個文件的文件保護,則需要這樣做。 如果權限和功能設置正確,則驗證權限應足以進行文件保護。
在側節點上,文件資源管理器工具(如iExplorer)對FileProtection的驗證沒有多大幫助,因為此類工具要求設備處於“受信任”模式,因此他們有權訪問您的設備/應用程序的內容。
祝好運!
可以基於每個文件或每個目錄啟用文件保護,也可以為整個應用程序啟用文件保護(使用權利和配置文件)。 要確定文件或目錄是否受保護,請檢查數據保護密鑰的文件系統屬性。 這應該是有效的,即使它是一個設置為受保護的父目錄:
- (BOOL) isProtectedItemAtURL:(NSURL *)URL {
BOOL result = YES;
NSDictionary *attributes = nil;
NSString *protectionAttributeValue = nil;
NSFileManager *fileManager = nil;
fileManager = [[NSFileManager alloc] init];
attributes = [fileManager attributesOfItemAtPath:[URL path] error:&error];
if (attributes != nil){
protectionAttributeValue = [attributes valueForKey:NSFileProtectionKey];
if ((protectionAttributeValue == nil) || [protectionAttributeValue isEqualToString:NSFileProtectionNone]){
result = NO;
}
} else {
// handle the error
}
return result;
}
為了確定受保護的內容是否可用,UIApplication提供了一種查詢保護狀態的方法, isProtectedDataAvailable
。 使用上述方法可以確定特定文件或目錄是否可用:
- (BOOL) isItemAtURLAvailable:(NSURL *)URL {
BOOL result = NO;
if ([self isProtectedItemAtURL:URL]){
// Item is protected
if ([[UIApplication sharedApplication] isProtectedDataAvailable]){
// Protected content is available
result = YES;
}
} else {
result = YES;
}
return result;
}
我不認為你可以用基於計算機的工具和非越獄的iPhone測試數據保護 - 也許你可以在過去。 請在此處查看我的答案,以獲取更新的數據保護測試方法: https : //stackoverflow.com/a/40044841/1165843
對於完整的測試,我建議使用iDB( https://github.com/dmayer/idb )等工具在iOS應用程序上執行pentesting,如本指南中所述 。 您也可以使用此安全測試的備忘單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.