㈠ android KeyStore密鑰存儲
利用 Android KeyStore System,您可以在容器中存儲加密密鑰,從而提高從設備中提取密鑰的難度。在密鑰進入密鑰庫後,可以將它們用於加密操作,而密鑰材料仍不可導出。此外,它提供了密鑰使用的時間和方式限制措施,例如要求進行用戶身份驗證才能使用密鑰,或者限制為只能在某些加密模式中使用。
密鑰庫系統由 KeyChain API 以及在 Android 4.3(API 級別 18)中引入的 Android 密鑰庫提供程序功能使用。本文說明了何時以及如何使用 Android 密鑰庫提供程序。
1、 存儲密匙:Android提供的這個KeyStore最大的作用就是不需要開發者去維護這個密匙的存儲問題,相比起存儲在用戶的數據空間或者是外部存儲器都更加安全。注意的是這個密匙隨著用戶清除數據或者卸載應用都會被清除掉。
2、得益於Android獨立的一套密匙庫系統,可以提高安全性
Android 密鑰庫系統可以保護密鑰材料免遭未經授權的使用。首先,Android 密鑰庫可以防止從應用進程和 Android 設備中整體提取密鑰材料,從而避免了在 Android 設備之外以未經授權的方式使用密鑰材料。其次,Android 密鑰庫可以讓應用指定密鑰的授權使用方式,並在應用進程之外強制實施這些限制,從而避免了在 Android 設備上以未經授權的方式使用密鑰材料。
Android 密鑰庫密鑰使用兩項安全措施來避免密鑰材料被提取:
為了避免在 Android 設備上以未經授權的方式使用密鑰材料,在生成或導入密鑰時 Android 密鑰庫會讓應用指定密鑰的授權使用方式。一旦生成或導入密鑰,其授權將無法更改。然後,每次使用密鑰時,都會由 Android 密鑰庫強制執行授權。這是一項高級安全功能,通常僅用於有以下要求的情形:在生成/導入密鑰後(而不是之前或當中),應用進程受到攻擊不會導緻密鑰以未經授權的方式使用。
支持的密鑰使用授權可歸為以下幾個類別:
作為一項額外的安全措施,對於密鑰材料位於安全硬體內部的密鑰(請參閱 KeyInfo.isInsideSecurityHardware()),某些密鑰使用授權可能由安全硬體實施,具體取決於 Android 設備。加密和用戶身份驗證授權可能由安全硬體實施。由於安全硬體一般不具備獨立的安全實時時鍾,時間有效性間隔授權不可能由其實施。
您可以使用 KeyInfo.() 查詢密鑰的用戶身份驗證授權是否由安全硬體實施。
在需要系統級憑據時請使用 KeyChain API。在應用通過 KeyChain API 請求使用任何憑據時,用戶需要通過系統提供的 UI 選擇應用可以訪問已安裝的哪些憑據。因此,在用戶同意的情況下多個應用可以使用同一套憑據。
使用 Android 密鑰庫提供程序讓各個應用存儲自己的憑據,並且只允許應用自身訪問。這樣,應用可以管理僅能由自己使用的憑據,同時又可以提供等同於 KeyChain API 為系統級憑據提供的安全優勢。這一方法不需要用戶選擇憑據。
要使用此功能,請使用標準的 KeyStore 和 KeyPairGenerator 或 KeyGenerator 類,以及在 Android 4.3(API 級別 18)中引入的 AndroidKeyStore 提供程序。
AndroidKeyStore 注冊為 KeyStore 類型以用於 KeyStore.getInstance(type) 方法,而在用於 KeyPairGenerator.getInstance(algorithm, provider) 和 KeyGenerator.getInstance(algorithm, provider) 方法時則注冊為提供程序。
生成新的 PrivateKey 要求您同時指定自簽署證書具備的初始 X.509 屬性。之後,您可以使用 KeyStore.setKeyEntry 將證書替換為由證書頒發機構 (CA) 簽署的證書。
要生成密鑰,請使用 KeyPairGenerator 和 KeyPairGeneratorSpec:
要生成密鑰,請使用 KeyGenerator 和 KeyGenParameterSpec。
AndroidKeyStore 提供程序的使用通過所有的標准 KeyStore API 加以實現。
通過調用 aliases() 方法列出密鑰庫中的條目:
通過從密鑰庫提取 KeyStore.Entry 並使用 Signature API(例如 sign())簽署數據:
類似地,請使用 verify(byte[]) 方法驗證數據:
生成密鑰或將密鑰導入到 AndroidKeyStore 時,您可以指定密鑰僅授權給經過身份驗證的用戶使用。用戶使用安全鎖定屏幕憑據(模式/PIN/密碼、指紋)的子集進行身份驗證。
這是一項高級安全功能,通常僅用於有以下要求的情形:在生成/導入密鑰後(而不是之前或當中),應用進程受到攻擊不會導緻密鑰被未經身份驗證的用戶使用。
如果密鑰僅授權給經過身份驗證的用戶使用,可以將其配置為以下列兩種模式之一運行:
㈡ Android密鑰庫系統KeyStore
利用 Android 密鑰庫系統,您可以在容器中存儲加密密鑰,從而提高從設備中提取密鑰的難度。在密鑰進入密鑰庫後,可以將它們用於加密操作,而密鑰材料仍不可導出。此外,它提供了密鑰使用的時間和方式限制措施,例如要求進行用戶身份驗證才能使用密鑰,或者限制為只能在某些加密模式中使用。
密鑰庫系統並不是讓程序直接進行存儲程序的私密信息的,比如說用戶賬號密碼,冊陵橋其提供了一個密鑰安全容器,保護密鑰材料免遭未經授權的使用,一個應用程序可以在密鑰庫中存儲多個密鑰並且只允許應用自身訪問,應用程序可以在密鑰庫系統中生成,存儲,獲取存儲其中的公鑰或者私鑰,因此可使用密鑰庫系統中的密鑰來進行數據的加密。
密鑰庫系統由 KeyChain API 以及在 Android 4.3(API 級別 18)中引入的 Android 密鑰庫提供程序功能使用。
安卓系統提供了下面幾種KeyStore類型:
各種類型的詳細說明可以參考: https://developer.android.com/openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#KeyStore
先州猛創建一個Activity,自定義布局從頁面上來實現幾種功能
效果圖:
說明:
1.輸入框輸入要增加的密鑰的名稱,點擊添加按鈕進行添加一個新密鑰;
2.輸入框輸入要刪除的密鑰的名稱,點擊刪除按鈕進行刪除一個已存在的密鑰;
3.這里指定了數據明文,點擊密鑰列表中的item可選中指定的密鑰,用於使用密鑰進行加密和解密,選中密鑰後,可點擊加密按鈕進行加密,加密後可點擊解密按鈕進行解密;
4.密鑰列表顯示當前應用在密鑰庫系統中生成了的密鑰,長按可刪除密鑰;
MainActivity
密鑰庫系統工具類
生成密鑰時使用X500Principal指定了自簽署證書,參數分別代表汪游
CN:通用名稱
O:組織
OU:組織單元
C:國家
並且指定密鑰的有效時間,並且指定了用於生成密鑰對的自簽名證書的序列號。
這里指定了通過密鑰庫系統生成RSA密鑰。
先從密鑰庫中取出密鑰,使用公鑰進行加密
先從密鑰庫中取出密鑰,使用私鑰進行解密
使用密鑰對數據簽名,簽名演算法須與秘鑰演算法保持一致。
使用密鑰對數據進行簽名認證,簽名演算法須與秘鑰演算法保持一致。
密鑰庫支持的演算法可參考: https://developer.android.com/training/articles/keystore
demo鏈接: https://github.com/samlss/KeyStore