Android 保存私密信息-強大的 keyStore
這里討論下如何使用 Android Keystore 保存密碼等敏感信息,如何加密、解密數據。
在開始討論之前我們先搞清楚一些基礎知識。Keystore不只是可以保存密碼,還可以保存敏感數據,而且它的實現方式使得黑客或者惡意程序很難破信息。
利用 Android 密鑰庫系統,您可以在容器中存儲加密密鑰,從而提高從設備中提取密鑰的難度。在密鑰進入密鑰庫后,可以將它們用于加密操作,而密鑰材料仍不可導出。此外,它提供了密鑰使用的時間和方式限制措施,例如要求進行用戶身份驗證才能使用密鑰,或者限制為只能在某些加密模式中使用。
一個應用程式只能編輯、保存、取出自己的密鑰。這個概念很簡單,但是功能很強大。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模式,將會被拒絕。可以在 這里 查看不同的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。
獲取加密數據:
獲取解密數據:
這就是整個過程了。
來自:http://mp.weixin.qq.com/s/S8v994Q6-A4TOmC9VlVCNQ