這里討論下如何使用Android Keystore保存密碼等敏感信息,如何加密、解密數據。
在開始討論之前我們先搞清楚一些基礎知識。Keystore不只是可以保存密碼,還可以保存敏感數據,而且它的實現方式使得黑客或者惡意程序很難破信息。
Android的Keystore系統可以把密鑰保持在一個難以從設備中取出數據的容器中。當密鑰保存到Keystore之后,可以在不取出密鑰的狀態下進行私密操作。此外,它提供了限制何時以何種方式使用密鑰的方法,比如使用密鑰時需要用戶認證或限制密鑰只能在加密模式下使用。
一個應用程式只能編輯、保存、取出自己的密鑰。這個概念很簡單,但是功能很強大。App可以生成或者接收一個公私密鑰對,并存儲在Android的Keystore系統中。公鑰可以用于在應用數據放置到特定文件夾前對數據進行加密,私鑰可以在需要的時候解密相應的數據。
如果你只是想看代碼,可以直接點擊這里。
簡單起見,我寫了一個demo演示如何使用Android Keystore保存密碼,加密、顯示加密形式以及解密。
這里我就不寫xml了,都是一些簡單的東西,我在文后貼出所有的代碼。
我這里新建了2個類文件。一個是EnCryptor,另一個是Decryptor。通過名字很容易知道其功能。
創建新密鑰
在開始編碼之前,我們需要給加密/解密數據的別名進行命名,名字可以是任意字符串,但是不可以是空字符串。別名是顯示在Android Keystore中生成的密鑰的名字。
首先我們需要獲取Android KeyGenerator的實例:
這里我們設置使用KeyGenerator的生成的密鑰加密算法是AES,我們將在AndroidKeyStore中保存密鑰/數據。
接下來我們能使用KeyGenParameterSpec.Builder 創建KeyGenParameterSpec ,傳遞給KeyGenerators的init方法。
KeyGenParameterSpec是什么,可以把它當作我們要生成的密鑰的參數。例如,我們需要給密鑰設置一個特定的過期時間。
KeyGenParameterSpec的代碼:
首先我們傳遞了一個別名,這個名字可以是任意的,之后我們設置意圖,是加密還是解密數據。
setBlockMode保證了只有指定的block模式下可以加密,解密數據,如果使用其它的block模式,將會被拒絕??梢栽?a target="_blank" rel="nofollow">這里查看不同的block模式。
我們使用了“AES/GCM/NoPadding”變換算法,還需要設置KeyGenParameterSpec的padding類型。
加密數據
以上的執行完之后,加密數據非常簡單:
首先我們使用keyGenParameterSpec初始化KeyGenerator,之后我們生成了SecretKey。
現在我們有了secretkey,我們可以初始化Cipher 對象,這將是實際的加密過程。我們需要設置Clipher編碼類型:
之后我們有了ciphers initialization vector (IV)的引用,可以用于解密。我們使用doFinal(textToEncrypt)
拿到了最終的編碼,doFinal(textToEncrypt)
返回的就是最重的加密數據。
解密
獲取KeyStore實例:
我們用keyStore獲取我們的secret key,我們還需要一個SecretKeyEntry:
之前KeyGenParameterSpecs中設置的block模式是KeyProperties.BLOCK_MODE_GCM,所以這里只能使用這個模式解密數據。
我們需要為GCMParameterSpec 指定一個認證標簽長度(可以是128、120、112、104、96這個例子中我們能使用最大的128),并且用到之前的加密過程中用到的IV。
獲取加密數據:
獲取解密數據:
這就是整個過程了。
源碼地址:HERE
推薦閱讀: