Android加密演算法淺析

也許每個人出生的時候都以為這世界都是為他一個人而存在的,當他發現自己錯的時候,他便開始長大

少走了彎路,也就錯過了風景,無論如何,感謝經歷

本篇文章遇到排版混亂的地方,可點選文末閱讀原文或前往該地址:https://orangey.blog.csdn.net/article/details/126219765

更多關於Android安全的知識,可前往:https://blog。csdn。net/ananasorangey/category11955914。html

Android加密演算法淺析

0x01 前言

車機滲透,博主感覺大致可分為:軟體層、系統層、硬體層

例如,我們測試軟體層以及系統層的時候,會關注一些加密演算法以及該密碼或敏感資料是否加密或加密後又如何解析,它們又存放在哪個位置等等。

例如,Android裝置(也可以是手機,也可以是智慧大屏等)解鎖螢幕時輸入的密碼,那麼這個密碼存放在哪裡?是否為明文儲存?如果是加密儲存,那麼加密演算法是什麼?

例如,連線一些車機WI-FI時,為了安全考慮會要求輸入PIN碼才能連線成功,那麼此時我們要考慮該PIN碼輸入的密碼,那麼這個密碼存放在哪裡?是否為明文儲存?如果是加密儲存,那麼加密演算法是什麼?

0x02 Android加密演算法淺析

這裡以Android 裡面的鎖屏為例,來對加密演算法瞭解,以點蓋面

Android 裝置中常見的鎖屏密碼主要有兩種:一種是手勢密碼(九宮格密碼圖);一種是輸入密碼,分為PIN密碼和複雜字元密碼,而PIN密碼就是數字密碼,比較簡單;還有一種是指紋密碼

我們這裡主要關注PIN碼來說說,透過工具獲取當前PIN輸入介面的View類,然後定位到一個鎖屏密碼工具類:LockPatternUtils。java

此處,大家可以思考一個小問題

:假如有一臺智慧後視鏡,智慧電視機等硬體裝置, 本身開啟熱點,但需要輸入PIN碼才能接入,但當前裝置可root接入,你會怎麼辦呢?是拆卸機器從串列埠進行攻擊?還是adb進入系統?

這裡以5。1版本的原始碼進行分析,至於真機或模擬器,當前按照自身條件來。

2。1 原始碼編譯(此處可跳過)

mkdir ~/binPATH=~/bin:$PATHcurl https://storage。googleapis。com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo

編輯 ~/bin/repo,把 REPO_URL 一行替換成下面的:

REPO_URL = ‘https://gerrit-googlesource。lug。ustc。edu。cn/git-repo’

Android加密演算法淺析

然後repo sync 一下同步

Android加密演算法淺析

後續步驟省略,,自行查詢。網上容易出現問題的是源地址錯誤等問題。

Windows 下載Android原始碼教程連結

模擬器博主用的是夜神模擬器(夜神預設手機機型是三星,大家可切換一下機型方便測試):

Android加密演算法淺析

探測一下試試是否能成功連線夜神模擬器:

adb connect 127。0。0。1:62001adb devicesadb shell

簡短的Android版本歷史Android 1。5紙杯蛋糕:2009年4月27日Android 1。6,Donut: 2009年9月15日Android 2。0-2。1,Eclair: 2009年10月26日(初始版本)Android 2。2-2。2。3,Froyo:2010年5月20日(初始版本)Android 2。3-2。3。7,薑餅:2010年12月6日(初始版本)Android 3。0-3。2。6,Honeycomb:2011年2月22日(初始版本)Android 4。0-4。0。4,冰淇淋三明治:2011年10月18日(初始版本)Android 4。1-4。3。1,Jelly Bean:2012年7月9日(初始版本)Android 4。4-4。4。4,KitKat: 2013年10月31日(初始版本)ndroid 5。0-5。1。1,棒棒糖:2014年11月12日(初始版本)Android 6。0-6。0。1,棉花糖:2015年10月5日(初始版本)Android 7。0-7。1。2,牛軋糖:2016年8月22日(初始版本)Android 8。0-8。1,奧利奧(Oreo):2017年8月21日(初始版本)Android 9。0,Pie:八月6,2018Android 10。0:2019年9月3日Android 11:2020年9月8日Android 12:2021年10月4日

博主,編譯老是出錯,最後直接下載現有的好了,地址如下(Android 5。1。1):Android 5。1。1原始碼

2。2 Android 鎖屏原始碼淺析

原始碼下載好後,開始正式進入正題,定位到鎖屏的java程式碼,瞭解鎖屏介面輸入密碼的規則,此處我們使用Android-SDK 3。0。1 (這裡你也可以使用最新版的,都是一樣的)中的uiautomatorviewer。bat(該工具預設是安裝在C盤當前使用者的/AppData/local/Android/Sdk/tools/bin目錄下)工具分析獲取當前的鎖屏View類LockPattern,一步步追蹤,最終會跟到一個包名為com。android。internal。widget鎖屏密碼工類:LockPatternUtils。java,如下圖:

下載地址:https://developer。android。com/studio/archive?hl=zh-cn

鎖屏程式碼的目錄路徑:frameworks/base/core/java/com/android/internal/widget/LockPatternView。java

如果是,下載的Github的原始碼的話在檔案的android\internal\widget目錄下

checkPasswordHistory的方法,這個方法就是來對比密碼是否一致的,能否成功解鎖手機的

Android加密演算法淺析

passwordToHash方法就是輸入密碼的演算法,繼續跟蹤(passwordToHash()方法):

Android加密演算法淺析

從上面程式碼的註釋中已經告訴我們,這個View是用於繪製九宮格和手勢密碼的地方。passwordToHash 方法中的引數為使用者輸入的密碼和當前使用者對應的id,一般裝置不會有多個使用者,所以這裡的userId是預設值0。再往下看就是加密演算法了:原文密碼+裝置的salt值,然後分別進行SHA-1和Md5加密,將資料複製到一個數組中後轉換成Hex編碼進行拼接,得到的就是最終儲存到本地的加密密碼內容。而這裡最重要的是如何獲取裝置對應的salt值,這可以跟蹤程式碼(getsalt()方法):

Android加密演算法淺析

檢視getsalt方法(如何獲取到裝置對應的salt值),long salt = getLong(LOCK_PASSWORD_SALT_KEY, 0, userId);,首先根據欄位key為lockscreen。password_salt從某個地方獲取salt值,透過if判斷該值為0的話,就呼叫SecureRandom。getInstance(“SHA1PRNG”)。nextLong()隨機生成一個,然後將其儲存到key為LOCK_PASSWORD_SALT_KEY的那個方法,最後將salt值轉換為Hex值即可,繼續跟蹤程式碼(getLong()方法):

Android加密演算法淺析

應該是把密碼儲存起來了,繼續跟蹤程式碼(getLockSettings()方法):

Android加密演算法淺析

透過getLong()方法發現這個地方用了AIDL型別,透過在ServiceManager中獲取一個服務來進行操作,那麼它應該是有相應的Service類,這裡是在包名為com。android。server。locksettings下的LockSettingsService。java類,找到這個類,檢視它的getLong方法

frameworks/base/services/core/java/com /android/server /LockSettingsService。java

如果是,下載的Github的原始碼的話在檔案的com\android\server目錄下

Android加密演算法淺析

到此,我們已經可以確定該Service類是儲存在資料庫中的了,而且在LockSettingsService構造方法中存在SQLiteDatabase的字眼

PS

:SQLiteDatabase代表一個數據庫物件,提供了操作資料庫的一些方法

Android加密演算法淺析

Android加密演算法淺析

這裡呼叫了mStorage方法,繼續跟蹤程式碼

Android加密演算法淺析

從上圖中的mStorage = new LockSettingsStorage(context, new LockSettingsStorage。Callback() 可以看到,將輸入的密碼存放到了資料庫中,繼續跟蹤程式碼:

到LockSettingsStorage方法中去看一下

Android加密演算法淺析

Android加密演算法淺析

資料庫名字叫做:locksettings。db,那麼它儲存在哪裡呢?

Android加密演算法淺析

兩個key檔案,那麼這個就是用來儲存加密之後的手勢密碼和輸入密碼的資訊到本地,下次開機解鎖就需要讀取這個檔案內容進行密碼比對了,檢視具體的存在路徑:

find -name / locksettings。db

Android加密演算法淺析

SQLite Expert Professional 是一個專用高階可靠的工具,旨在幫助大家同時管理多個數據庫,並且執行各種資料庫語法。由於所有選單功能整合到一個簡約易懂的視窗中,剛入門的人員和專業人員都能很好的掌握該工具。在主視窗中,使用者可以直接明瞭的檢視所有已連線的資料庫,並使用相關的語法進行操作。左側區域為可用表,能夠進行欄位重組、外來鍵、觸發器等功能,並且不會丟失任何資料庫資訊。如果需要連線或者開啟新的資料庫,則可以透過選單中的檔案選項進行操作,併為檔名或者新資料庫重新命名。除此之外,該工具還能輕鬆處理並糾正故障,保證資料庫不會受到外界的干擾和影響。

首先設定鎖屏密碼(模擬器中設定鎖屏密碼):

Android加密演算法淺析

PS:

/data/data/com。android。providers。settings/databases/databasessettings。db(Android 4。0及以前)/data/system/locksettings。db(Android4。1及以後)

單獨複製locksettings。db 是沒資料的,如下:

Android加密演算法淺析

應該將locksettings。db-shm、locksettings。db-wal 一起複製出來

adb pull /data/system/locksettings。dbadb pull /data/system/locksettings。db-shmadb pull /data/system/locksettings。db-wal

Android加密演算法淺析

salt值:-2428488924405522123

還有一個加密密碼Key檔案

adb pull /data/system/password。key 。

E03FF03CA6C923FC3D7BE13ECA1AD9E159917CD7F901431E8569A3F7F815E570E758EBD5

最終的值應該是類似這樣的(MD5(輸入明文密碼+裝置的salt)。Hex+SHA1(輸入明文密碼+裝置的salt)。Hex就是最終的加密內容)拼接起來就是密碼:

Android加密演算法淺析

Android加密演算法淺析

但我這裡借出來跟原生程式不太一樣,發現是模擬器用的是三星的系統,這個系統對鎖屏做過修改,沒有用原生程式,網上有程式碼說是做了1024次Sha1運算,此處可以使用hashcat 爆破,三星做了1024次Sha1運算程式碼如下:

public byte[] passwordToHash(String paramString) { if (paramString == null) return null; String str = null; byte[] arrayOfByte1 = null; try { byte[] arrayOfByte2 = (paramString + getSalt())。getBytes(); byte[] arrayOfByte3 = null; str = “SHA-1”; MessageDigest localMessageDigest = MessageDigest。getInstance(str); long l1 = System。currentTimeMillis(); for (int i = 0; i < 1024; i++) { arrayOfByte1 = null; if (arrayOfByte3 != null) localMessageDigest。update(arrayOfByte3); localMessageDigest。update((“” + i)。getBytes()); localMessageDigest。update(arrayOfByte2); arrayOfByte3 = localMessageDigest。digest(); } arrayOfByte1 = toHex(arrayOfByte3)。getBytes(); long l2 = System。currentTimeMillis(); Log。w(“LockPatternUtils”, “passwordToHash time = ” + (l2 - l1) + “ms”); return arrayOfByte1; } catch (NoSuchAlgorithmException localNoSuchAlgorithmException) { Log。w(“LockPatternUtils”, “Failed to encode string because of missing algorithm: ” + str); } return arrayOfByte1; }

PIN或複雜密碼,因為salt 值是隨機的,且輸入密碼加salt後再sha1+md5拼接複雜的多,所以安全性相對九宮格密碼要安全一些

參考連結:

http://blog。md5。red/?p=456

http://www。520monkey。com/archives/1022

你以為你有很多路可以選擇,其實你只有一條路可以走