Android保存私密信息-強大的keyStore(譯)

這里討論下如何使用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

原文地址:https://medium.com/@josiassena/using-the-android-keystore-system-to-store-sensitive-information-3a56175a454b#.3lly5mk5i

推薦閱讀:

重要-作為Android開發者必須了解的Gradle知識

編寫高效的Android代碼(譯)

Android中使用gradient的一條建議

尋找卓越的(Android)軟件工程師

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,660評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • 本文主要介紹移動端的加解密算法的分類、其優缺點特性及應用,幫助讀者由淺入深地了解和選擇加解密算法。文中會包含算法的...
    蘋果粉閱讀 11,539評論 5 29
  • 寫在前面 今天使用高德地圖為應用添加Key的時候,發現有一項需要用到安全碼SHA1,而SHA1存在于Keystor...
    代碼咖啡閱讀 26,827評論 5 34
  • 老劉,56歲,陜西鎮安人,老兩口一起在磚窯干活,老板按計件,兩個人每月各能拿到手2千多。 白師傅,43歲,窯工,陜...
    琮鈞閱讀 1,612評論 2 1