iOS和macOS應用程式本地資料庫金鑰處理設計

楊闖發表於2018-03-13

對於使用者隱私資料需要儲存到資料庫中,並要對資料庫進行加密,那麼如何設定金鑰保證資料庫加密是一個至關重要的問題。

在不考慮相關黑客或白客通過逆向的情況下,我的主要策略如下: 金鑰長度足夠的長 如果一個資料庫的金鑰特別的長,就會增加破解的難度,如果長度保持在一二百位的話,暴力破解的時間會大大加長。 不同裝置間金鑰各不相同 雖然其他人可能破解到了一個裝置的金鑰,但是如果不同裝置之間的金鑰各不相同,那麼破解了其中一個裝置的金鑰後,再去破解另外一個裝置金鑰的難度不會減少,由於iOS和macOS之間系統開發程度的不同,採取不一樣的策略

系統名稱| keychain說明 | 裝置唯一標識說明 - | :-: | -: iOS | 可以直接進行keychain的儲存,在不越獄的情況下不可以通過其他程式獲取 | 涉及使用者隱私,無法讀取 macOS | 如果使用,彈出對話方塊詢問使用者是否允許使用,體驗性差 | 可以獲取到裝置的UDID、裝置號、Mac地址

實現

通過對以上情況進行分析,可以針對iOS設計出來隨機字串和固定字串相結合、不同裝置之間金鑰各不相同、金鑰長度長到難以破解的程度,針對Mac設計出來*不同裝置之間金鑰各不相同、金鑰長度難以破解的程度,具體實現方案如下:

iOS

1、生成一個由200個拼音和數字拼接而成的隨機字串,作為temp1,儲存到keychain裡面 2、程式中寫死一個固定字串,作為key 3、以key為金鑰將temp1進行RC4加密,生成一個新的200位的字串temp2作為資料庫金鑰 在使用過程中,針對第一步先要檢視本地keychain中是否存在temp1,如果存在直接進入第二步,如果不存在則重新生成。

Mac

1、將Mac裝置的UDID作為key 2、程式中寫死一個200位的固定字串,作為temp1 3、按照iOS的加密策略,生成一個長度比較長的字串,作為資料庫的金鑰

開啟資料庫後,可以通過SQL語句"SELECT name FROM sqlite_master WHERE type='table' "來判斷資料庫查詢語句是夠能夠得到有效查詢,如果查詢有效,則表示金鑰正確,繼續後續的相關處理,否則金鑰錯誤,刪除當前檔案,重新建立資料庫進行後續的操作。

相關文章