Android 密鑰保護

談到 Android 安全性話題宫静,Android Developers 官方網(wǎng)站給出了許多很好的建議和講解,涵蓋了存儲數(shù)據(jù)、權(quán)限囊嘉、網(wǎng)絡(luò)温技、處理憑據(jù)、輸入驗證扭粱、處理用戶數(shù)據(jù)、加密等方方面面震檩,甚至對于動態(tài)加載代碼也提供了建議琢蛤,具體可以看看 training 的 security tips 章節(jié)。而今天抛虏,我想特別來講一講在 Android 密鑰保護和 C/S 網(wǎng)絡(luò)傳輸安全 這兩方面的具體安全措施博其。

密鑰的保護以及網(wǎng)絡(luò)傳輸安全 應(yīng)該是移動應(yīng)用安全最關(guān)鍵的內(nèi)容。

所謂的密鑰迂猴,簡單來說慕淡,可以認為是我們常用的 app key / secret / token 或數(shù)據(jù)加密的 key,這些 keys 就像我們寶庫的鑰匙沸毁,一旦泄露峰髓,就像大門被人撬開,什么安全都無從談起息尺。因此携兵,密鑰們的安全存儲、防竊取便顯得異常重要搂誉。我曾經(jīng)看過許多國內(nèi)外著名的應(yīng)用在使用自家 API 或 SaaS 服務(wù)的時候徐紧,在 Java 代碼或 SharePreferences 里明文記錄著 app key / secret / token,這樣的做法炭懊,就算使用了 proguard 對代碼進行混淆并级,也是非常容易被逆向獲得服務(wù)端接入密鑰,非常危險侮腹。

在這一方面嘲碧,Android 提供大量用來保護數(shù)據(jù)的加密算法,例如 Cipher 類中提供了 AES 和 RSA 算法凯旋,再例如安全隨機數(shù)生成器 SecureRandom 給 KeyGenerator 提供了更加可靠的初始化參數(shù)呀潭,避免離線攻擊等等。

而如果需要存儲密鑰以供重復(fù)使用至非,Android 提供了 KeyStore 等可以長期存儲和檢索加密密鑰的機制钠署,Android KeyStore 系統(tǒng)特別適合于存儲加密密鑰』耐郑”AndroidKeyStore” 是 KeyStore 的一個子集谐鼎,存進 AndroidKeyStore 的 key 將受到簽名保護,并且這些 key 是存在系統(tǒng)里的趣惠,而不是在 App 的 data 目錄下狸棍,依托于硬件的 KeyChain 存儲身害,可以做到 private key 一旦存入就無法取出,總之草戈,每個 App 自己創(chuàng)建的 key塌鸯,別的應(yīng)用是訪問不到的。

很多時候唐片,我們會需要將用戶的賬號密碼或 token 存儲下來丙猬,以做到下次打開免登的目的。

KeyStore 提供了兩個能力:

生成隨機加密密鑰
安全存儲和讀取數(shù)據(jù)
有了這兩個能力费韭,我們的密鑰保護就變得很容易了茧球,你只需要:

在應(yīng)用安裝后第一次運行時,生成一個隨機密鑰星持,并存入 KeyStore
當你想存儲一個數(shù)據(jù)抢埋,便從 KeyStore 中取出之前生成的隨機密鑰,對你的數(shù)據(jù)進行加密督暂,加密完成后揪垄,已完成加密的數(shù)據(jù)可以隨意存儲在任意地方,比如 SharePreferences损痰,此時即使它被他人讀取到福侈,也無法解密出你的原數(shù)據(jù),因為他人取不到你的密鑰
當你需要拿到你的原數(shù)據(jù)卢未,只需要從 SharePreferences 中讀取你加密后的數(shù)據(jù)肪凛,并從 KeyStore 取出加密密鑰,使用加密密鑰對 “加密后的數(shù)據(jù)” 進行解密即可
其中加密算法可以使用 Cipher AES 來保證安全性辽社,不要使用自己創(chuàng)造的加密算法伟墙。

這就是使用 KeyStore 的一整套流程,另外 KeyStore 還可以用來做數(shù)據(jù)簽名和簽名驗證滴铅,就像一個黑匣子一樣戳葵,具體可以自行搜索了解。

KeyStore 適用于生成和存儲密鑰汉匙,這些密鑰可以用來加密運行時獲取到的數(shù)據(jù)拱烁,比如運行時,用戶輸入的密碼噩翠,或者服務(wù)端傳下來的 token戏自。但對于需要預(yù)設(shè)在 App 內(nèi)的 API key / secret,因為 KeyStore 是運行時隨機生成加密密鑰伤锚,所以我們無法預(yù)估API key / secret 會被加密成什么樣擅笔,自然也就無法預(yù)先把加密后的 API key / secret 預(yù)埋在 App 內(nèi),因此對于這類需要預(yù)設(shè)的固定密鑰,我將介紹另外一種十分安全猛们、難破解的保護方式念脯。

首先我們需要思考,這個 key 應(yīng)該放到哪里才能夠最大限度提升其被逆向獲取的難度弯淘,放 Java 代碼里绿店?根本不安全。放文件或圖片像素里庐橙?頂多續(xù) 1 小時惯吕。放 so 庫里?可以怕午,so 庫能夠很大程度提升逆向破解難度,但如果別人把 so 庫文件拿出來淹魄,再直接調(diào)用這些 native 接口郁惜,便也可以獲取到你的 key,怎么辦甲锡?

我的做法是在 so 庫的 C 代碼里 JNI_OnLoad() 方法對 APK 簽名進行驗證兆蕉,如果簽名不對,直接 crash缤沦,這樣移植出去便和磚頭沒什么兩樣虎韵。而你的應(yīng)用又不得不依賴這個 so 庫進行獲取 API key / secret,因此它又不能直接剝離缸废,這就保證了不能沒有它包蓝,又不能移植它,換句話說就是:如果別人反編譯了你的代碼企量,發(fā)現(xiàn)你使用 so 進行簽名驗證测萎,便直接把這個 so 文件摘掉,這樣做的結(jié)果是届巩,App 獲取不到你存在 so 中的 secret 了硅瞧,便無法正常工作了;而如果別人對你的應(yīng)用進行修改和重新簽名恕汇,或移植你的 so 庫來讀取內(nèi)部的 secret腕唧,則會因為簽名驗證不通過直接自爆。

以上便是對于保護 key / secret 的一些有效舉措瘾英,再總結(jié)下就是枣接,使用 so 庫存儲預(yù)設(shè) key / secret,使用 Android KeyStore 存儲運行時動態(tài)獲取到的私密內(nèi)容方咆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末月腋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榆骚,老刑警劉巖片拍,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妓肢,居然都是意外死亡捌省,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門碉钠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纲缓,“玉大人,你說我怎么就攤上這事喊废∽8撸” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵污筷,是天一觀的道長工闺。 經(jīng)常有香客問我,道長瓣蛀,這世上最難降的妖魔是什么陆蟆? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮惋增,結(jié)果婚禮上叠殷,老公的妹妹穿的比我還像新娘。我一直安慰自己诈皿,他們只是感情好林束,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纫塌,像睡著了一般诊县。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上措左,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天依痊,我揣著相機與錄音,去河邊找鬼怎披。 笑死胸嘁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的凉逛。 我是一名探鬼主播性宏,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼状飞!你這毒婦竟也來了毫胜?” 一聲冷哼從身側(cè)響起书斜,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酵使,沒想到半個月后荐吉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡口渔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年样屠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缺脉。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡痪欲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攻礼,到底是詐尸還是另有隱情业踢,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布礁扮,位于F島的核電站陨亡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏深员。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一蛙埂、第九天 我趴在偏房一處隱蔽的房頂上張望倦畅。 院中可真熱鬧,春花似錦绣的、人聲如沸叠赐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芭概。三九已至,卻和暖如春惩嘉,著一層夾襖步出監(jiān)牢的瞬間罢洲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工文黎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惹苗,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓耸峭,卻偏偏與公主長得像桩蓉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子劳闹,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,732評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理院究,服務(wù)發(fā)現(xiàn)洽瞬,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 1 概述 日常工作中业汰,需要對文件或者是目錄創(chuàng)建鏈接伙窃,使得工作更加方便 2 硬鏈接 硬鏈接用于創(chuàng)建文件,不能用于創(chuàng)建...
    ghbsunny閱讀 922評論 0 0
  • 順序 head標簽順序 css屬性順序 位置屬性(position, top, right, z-index, d...
    靜候那一米陽光閱讀 256評論 0 0
  • 《共鳴》 作者:張澤彬 說起《我在等待一個人》這一首歌曲的創(chuàng)作,也算是緣分氛濒,也是一種共鳴产场。 前兩年,在普寧作協(xié)張主...
    后生仔著拼閱讀 563評論 0 2