首頁 > 科技

Android官方的加密庫-security該怎麼做?

2021-09-04 03:02:25

概覽

Security 庫提供了與讀取和寫入靜態資料以及金鑰創建和驗證相關的安全最佳做法的實現。

該庫使用構建器模式為以下安全等級提供安全的預設設定:

  • 在可靠加密和良好效能之間取得平衡的強安全性這種安全等級適用於銀行應用和聊天應用等消費者應用,以及執行證書吊銷檢查的企業應用。

  • 最高安全性這種安全等級適用於需要由硬體支援的金鑰庫和需要使用者介入以提供金鑰訪問許可權的應用。

祕鑰管理

  • Security庫可以使用多個金鑰集,可以對檔案和sp進行加密。金鑰集被儲存在sp中

  • 主金鑰被儲存在系統金鑰庫中

Security加密操作

依賴

使用Security庫需要匯入以下依賴

implementation("androidx.security:security-crypto:1.0.0")

implementation("androidx.security:security-identity-credential:1.0.0-alpha02")

implementation("androidx.security:security-app-authenticator:1.0.0-alpha02")

androidTestImplementation("androidx.security:security-app-authenticator:1.0.0-alpha01")

存在的問題

Security庫支援的最低api版本是24,我們有以下兩種方式解決:

manifest中聲明<uses-sdk tools:overrideLibrary="androidx.security.identity.credential,androidx.security" />

提升最低api版本為24,不過這樣就需要對高於api24和低於api24兩種情況分別做適配了

使用Security進行檔案加密操作

寫入加密資料

無法重複寫入

當要寫入的檔案已經存在時,重複寫入資料的時候openFileOutput方法會拋出異常,原因就是無法重複寫入,見註釋:

寫入資料:

程式碼

本例程式碼中EncryptedFile.Builder的構建耗時最長,在我的手機上能達到300-600ms的水平,所以非敏感的檔案儘量不要用到加密

另外儲存進檔案的資料膨脹也很大,這意味著佔用了更大的儲存空間

val encrypt = EncryptedFile.Builder(

getFile("安安安安卓寫入檔案加密資料.txt").apply {

if (exists()) {//如果已存在就先刪除檔案

delete()

}

},

this@MainActivity,

"隨便寫個key",

EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB

).build()

startRecord()

encrypt.openFileOutput().apply {

write("隨便寫入點字元串".toByteArray(charset = Charsets.UTF_8))

flush()

close()

}

效果

讀取加密資料

val encrypt = EncryptedFile.Builder(

getFile(

"安安安安卓寫入檔案加密資料.txt"

),

val bytes = BufferedInputStream(encrypt.openFileInput()).readBytes()

val result = String(bytes, charset = Charsets.UTF_8)

使用Security進行SharePreference進行加密操作

Security庫提供了EncryptedSharedPreferences對存入sp的key-value進行加密

不過眾所周知的sp是個坑爹的東西,所以仍然只應該把EncryptedSharedPreferences運用到敏感的資料儲存上

寫入資料到Shar

share = EncryptedSharedPreferences.create(

"encryptdata",

"key",

this@MainActivity,

EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,

EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM

)

share.edit().let {

it.putString("key", "SharePreference資料")

it.apply()

從SharePreference讀取資料

val value = share.getString("key", "")

總結,以上是小編給大家分享的android官方的加密庫,希望對大家有所幫助!普及


IT145.com E-mail:sddin#qq.com