本篇文章為大家展示了Android M中的鎖屏密碼是如何進行存儲的,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
鄱陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
Android M 之前鎖屏密碼的存儲
在 Android M 之前,鎖屏密碼的存儲格式很簡單,其使用了 64 位隨機數(shù)作為 salt 值,此 salt 值被存儲在 SQLite 數(shù)據(jù)庫 /data/system/locksettings.db 中。密碼在存儲的時候,會將輸入的密碼加上此隨機數(shù)組成新的字符串。然后對新的字符串分別進行 SHA-1 和 MD5 加密,將加密后的密文通過 MD5 + SHA-1 的方式進行字符串拼接,組成新的密文存儲在 /data/system/password.key 中,共有 72 位。其加密后的形式如下:
/data/system # cat password.keyB40C2F6FE4E89F3386D4E689B135304410D64951914FB35770FDAC58B694177B29297A80
而密碼的詳細信息,存儲在 /data/system/device_policies.xml 中,內(nèi)容類似如下:
/data/system # cat device_policies.xml
其中主要用到的兩個字段 quality 是密碼的類型,簡單密碼和復(fù)雜密碼的值不同,length 是密碼的長度,其他字段存儲密碼中各種字符的數(shù)量。
Android M 中鎖屏密碼的存儲
在 Android M 中,鎖屏密碼的存儲格式發(fā)生了變化,其默認的存儲格式在/system/gatekeeper/include/gatekeeper/password_handle.h 中描述如下:
typedef uint64_t secure_id_t;typedef uint64_t salt_t;/** * structure for easy serialization * and deserialization of password handles. */static const uint8_t HANDLE_VERSION = 2;struct __attribute__ ((__packed__)) password_handle_t { // fields included in signature uint8_t version; secure_id_t user_id; uint64_t flags; // fields not included in signature salt_t salt; uint8_t signature[32]; bool hardware_backed;};
其中 version 默認是 2,user_id 是 Android 用戶 id ,signature 存儲的便是密文,hardware_backed 存儲的是加密方式,0 表示密文是軟件加密,而 1 表示密文是通過 TEE 環(huán)境進行加密得到的。
密碼加密后默認以 password_handle_t 格式存儲在/data/system/gatekeeper.password.key 中。密碼的生成和校驗,在 HAL 層是通過 system/core/gatekeeperd/gatekeeperd.cpp 中的函數(shù)實現(xiàn)的。其在系統(tǒng)啟動時被注冊為 gatekeeperd 服務(wù),服務(wù)在啟動的時候會調(diào)用 GateKeeperProxy()對象,此類的構(gòu)造函數(shù)會去查找 TEE module,如果找到,則通過 TEE 設(shè)備進行加解密,如果沒有找到,則通過一個軟件設(shè)備進行加解密。
這里主要分析下通過軟甲設(shè)備解密的邏輯。解密時,會調(diào)用到system/core/gatekeeperd/gatekeeperd.cpp 中的以下函數(shù):
int verify(uint32_t uid, const uint8_t *enrolled_password_handle, uint32_t enrolled_password_handle_length, const uint8_t *provided_password, uint32_t provided_password_length, bool *request_reenroll)
在此函數(shù)中,由于沒有使用 TEE,所以會調(diào)用到軟件設(shè)備驗證 system/core/gatekeeperd/SoftGateKeeperDevice.cpp 中的:
int SoftGateKeeperDevice::verify(uint32_t uid, uint64_t challenge, const uint8_t *enrolled_password_handle, uint32_t enrolled_password_handle_length, const uint8_t *provided_password, uint32_t provided_password_length, uint8_t **auth_token, uint32_t *auth_token_length, bool *request_reenroll)
函數(shù)進行校驗,此函數(shù)對傳進來的信息進行處理后交到system/gatekeeper/gatekeeper.cpp 中的
void GateKeeper::Verify(const VerifyRequest &request, VerifyResponse *response)
進行處理,在這里對參數(shù)進行一系列處理和重新組織后再交給
bool GateKeeper::DoVerify(const password_handle_t *expected_handle, const SizedBuffer &password)
進行校驗,在此函數(shù)中,再調(diào)用
bool GateKeeper::CreatePasswordHandle(SizedBuffer *password_handle_buffer, salt_t salt, secure_id_t user_id, uint64_t flags, uint8_t handle_version, const uint8_t *password, uint32_t password_length)
將上面提到的 /data/system/gatekeeper.password.key
文件中存儲的信息進行解析,然后調(diào)用
ComputePasswordSignature(password_handle->signature, sizeof(password_handle->signature), password_key, password_key_length, to_sign, sizeof(to_sign), salt);
函數(shù)將輸入的密碼進行加密,從這里可以看到,輸入的密碼要加密成密文只需要用到存儲的密碼中的 salt 值,此函數(shù)在system/core/gatekeeperd/SoftGateKeeper.h 中,其調(diào)用 crypto 庫中的
crypto_scrypt(password, password_length, reinterpret_cast(&salt), sizeof(salt), N, r, p, signature, signature_length);
將輸入的密碼存儲在 signature 中并返回。此函數(shù)最終會通過 SHA256 進行加密,參數(shù)中的 N, r, p 默認為如下值:
static const uint64_t N = 16384;static const uint32_t r = 8;static const uint32_t p = 1;
通過以上處理后對輸入的密碼加密后得到的密文與手機中存儲的密文進行比較后返回校驗結(jié)果,從而判斷輸入的密碼的正確與否。
在 Android M 中,改變了之前直接在 Java 層進行密碼校驗的方式,將密碼的校驗通過 HAL 層的服務(wù)進行處理,同時加入對 TEE 的支持,使得鎖屏密碼的安全性大大提升,同時也可以方便的支持其他的安全特性,提升了整個系統(tǒng)的安全性。
上述內(nèi)容就是Android M中的鎖屏密碼是如何進行存儲的,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
標題名稱:AndroidM中的鎖屏密碼是如何進行存儲的
網(wǎng)址分享:http://www.rwnh.cn/article44/gpoeee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、虛擬主機、電子商務(wù)、動態(tài)網(wǎng)站、標簽優(yōu)化、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)