# Flutter 好用package - flutter_secure_storage 介紹 ## flutter_secure_storage 透過安卓的 KeyStore 及 iOS 的 KeyChain 儲存金鑰,這是一個允許開發人員在容器中創建和存儲加密密鑰的系統,使金鑰更難從設備中提取,例如:記住我的帳號功能,在下次重新開啟 APP 時希望帳號可以被記憶,但機敏性資料(帳號)需要加密後才能存在本地,那把加密後的金鑰就很適合儲存在這一個容器內。 ``` flutter pub add flutter_secure_storage ``` [官網](https://pub.dev/packages/flutter_secure_storage) ## 安卓的 [KeyStore](https://developer.android.com/training/articles/keystore?hl=zh-cn) ### 使用條件 1. 雖在 Android 4.3 (API 級別 18) 就被引入,但[絕大多數的功能](https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.Builder#public-methods_1)都需要在 <font color='red'>Android 6.0 (API 級別 23) 以上才支援</font> 2. Android KeyStore 的金鑰是保存在 Android 系統本身的加密區域中 Hardware Security Module, HSM)來保存金鑰,而不是直接存在應用程式的內部存儲器中。所以<font color='red'>設備必須支持硬體加密功能,即需要搭載有安全元件(Secure Element)或安全指令集架構(TEE)</font>。從 Android 6.0(Marshmallow)開始,Google 強制要求所有設備都支持硬體加密,並使用安全指令集架構(TEE)實現。但實際上,不是所有設備都能夠完全支持 TEE,有些設備可能只能部分支持 TEE 功能。 3. <font color='red'>設備必須啟用屏幕鎖定功能</font>,且必須有一個有效的屏幕鎖定密碼、模式或 PIN 碼。這是為了保護 KeyStore 中存儲的敏感數據,以防止未經授權的訪問。 4. 設備必須安裝有 Google Play services 並保持最新狀態。這是因為 Android KeyStore 使用 Google Play services 提供的安全 API,需要保持最新狀態以確保安全性。但不一定要上架 Google Play 也可以使用自定義憑證或是搭配自建的安全服務使用。 ### 刪除時機 Android KeyStore 中的金鑰可能會在以下情況下被刪除: 1. 當用戶清除應用程式資料或卸載應用程式時,所有與該應用程式相關聯的金鑰都會被刪除。 2. 當用戶更改解鎖密碼或 PIN 碼時,與用戶的解鎖密碼或 PIN 碼相關聯的金鑰都會被刪除。 3. 當金鑰過期時,金鑰也會被自動刪除。 4. 當金鑰的可用性狀態(例如金鑰被標記為已銷毀)發生變化時,金鑰也可能會被刪除。 5. 當裝置的安全性被威脅時,系統可能會強制刪除存儲在 Android KeyStore 中的所有金鑰。 需要注意的是,這些金鑰的刪除並不是立即生效的,而是會在一段時間內進行。這是為了保護使用金鑰的應用程式不會因為金鑰被意外刪除而受到影響。 ## iOS 的 [KeyChain](https://developer.apple.com/documentation/security/keychain_services#//apple_ref/doc/uid/TP30000897-CH203-TP1) ### 使用條件 1. 自 iOS 2.0 起就已經支援 KeyChain 2. 需要有一個有效的 App ID,並且已經啟用了 Keychain 功能。可以在 [Apple 開發者中心](https://developer.apple.com/ )進行設定。 3. 需要為 App ID 建立一個憑證,並且在該憑證中啟用 Keychain 功能。這可以在 Xcode 的「Certificates, Identifiers & Profiles」頁面中進行設定。 4. 在程式碼中使用 Keychain 存儲敏感數據之前,需要獲取一個可用的 SecAccessControl 對象,並且將其與要存儲的數據一起傳遞給 Keychain API。這將確保只有授權的用戶可以訪問存儲的數據。 ### 程式範例 使用對稱式加密 AES,降低加密資料所需的時間(但需在 Android 6.0 (API 級別 23) 以上才支援)並將金鑰存在金鑰庫,加密後的檔案存入 SharedPrefrences方便讀取。 github: | 加密本地資料 | 更換本地金鑰 |刪除本地資料 | | -------- | -------- | -------- | | ![](https://i.imgur.com/EWOx020.gif) | ![](https://i.imgur.com/gIw9O9a.gif)| ![](https://i.imgur.com/Quw8SLu.gif) | ## 待追蹤討論 AES key 直接 hard code !? https://github.com/mogol/flutter_secure_storage/issues/522 ## 參考資料 https://medium.com/joe-tsai/%E4%BD%BF%E7%94%A8keystore-%E5%84%B2%E5%AD%98%E6%95%8F%E6%84%9F%E6%80%A7%E8%B3%87%E6%96%99-92ad9b236e58 ###### tags: `flutter`