HMAC是密鑰相關的哈希運算消息認證碼,HMAC運算利用哈希算法,以一個密鑰和一個消息為輸入,生成一個消息摘要作為輸出。
HMAC的應用
hmac主要應用在身份驗證中,它的使用方法是這樣的:
(1) 客戶端發出登錄請求(假設是瀏覽器的GET請求)
(2) 服務器返回一個隨機值,並在會話中記錄這個隨機值
(3) 客戶端將該隨機值作為密鑰,用戶密碼進行hmac運算,然后提交給服務器
(4) 服務器讀取用戶數據庫中的用戶密碼和步驟2中發送的隨機值做與客戶端一樣的hmac運算,然后與用戶發送的結果比較,如果結果一致則驗證用戶合法
在這個過程中,可能遭到安全攻擊的是服務器發送的隨機值和用戶發送的hmac結果,而對於截獲了這兩個值的黑客而言這兩個值是沒有意義的,絕無獲取用戶密碼的可能性,隨機值的引入使hmac只在當前會話中有效,大大增強了安全性和實用性。大多數的語言都實現了hmac算法,比如php的mhash、python的hmac.py、java的MessageDigest類,在web驗證中使用hmac也是可行的,用js進行md5運算的速度也是比較快的。
RPMB HMAC 使用例子
1、RPMB 數據讀取
RPMB 數據讀取的流程如下:
1)Host 向 eMMC 發起讀 RPMB 的請求,同時生成一個 16 bytes 的隨機數,發送給 eMMC。
2)eMMC 將請求的數據從 RPMB 中讀出,並使用 Secure Key 通過 HMAC(哈希消息驗證碼) SHA-256 算法,計算讀取到的數據和接收到的隨機數拼接到一起后的簽名。然后,eMMC 將讀取到的數據、接收到的隨機數、計算得到的簽名一並發送給 Host。
3)Host 接收到 RPMB 的數據、隨機數以及簽名后,首先比較隨機數是否與自己發送的一致,如果一致,再用同樣的 Secure Key 通過 HMAC SHA-256 算法對數據和隨機數組合到一起進行簽名,如果簽名與 eMMC 發送的簽名是一致的,那么就可以確定該數據是從 RPMB 中讀取到的正確數據,而不是攻擊者偽造的數據。
通過上述的讀取流程,可以保證 Host 正確的讀取到 RPMB 的數據。
2、RPMB 數據寫入
RPMB 數據寫入的流程如下:
1)Host 按照上面的讀數據流程,讀取 RPMB 的 Write Counter。
2)Host 將需要寫入的數據和 Write Counter 拼接到一起並計算簽名,然后將數據、Write Counter 以及簽名一並發給 eMMC。eMMC 接收到數據后,先對比 Write Counter 是否與當前的值相同,如果相同那么再對數據和 Write Counter 的組合進行簽名,然后和 Host 發送過來的簽名進行比較,如果簽名相同則鑒權通過,將數據寫入到 RPMB 中。
通過上述的寫入流程,可以保證 RPMB 不會被非法篡改。
RPMB 數據讀取的流程如下:
1)Host 向 eMMC 發起讀 RPMB 的請求,同時生成一個 16 bytes 的隨機數,發送給 eMMC。
2)eMMC 將請求的數據從 RPMB 中讀出,並使用 Secure Key 通過 HMAC(哈希消息驗證碼) SHA-256 算法,計算讀取到的數據和接收到的隨機數拼接到一起后的簽名。然后,eMMC 將讀取到的數據、接收到的隨機數、計算得到的簽名一並發送給 Host。
3)Host 接收到 RPMB 的數據、隨機數以及簽名后,首先比較隨機數是否與自己發送的一致,如果一致,再用同樣的 Secure Key 通過 HMAC SHA-256 算法對數據和隨機數組合到一起進行簽名,如果簽名與 eMMC 發送的簽名是一致的,那么就可以確定該數據是從 RPMB 中讀取到的正確數據,而不是攻擊者偽造的數據。
通過上述的讀取流程,可以保證 Host 正確的讀取到 RPMB 的數據。
2、RPMB 數據寫入
RPMB 數據寫入的流程如下:
1)Host 按照上面的讀數據流程,讀取 RPMB 的 Write Counter。
2)Host 將需要寫入的數據和 Write Counter 拼接到一起並計算簽名,然后將數據、Write Counter 以及簽名一並發給 eMMC。eMMC 接收到數據后,先對比 Write Counter 是否與當前的值相同,如果相同那么再對數據和 Write Counter 的組合進行簽名,然后和 Host 發送過來的簽名進行比較,如果簽名相同則鑒權通過,將數據寫入到 RPMB 中。
通過上述的寫入流程,可以保證 RPMB 不會被非法篡改。
HMAC 計算網站
https://1024tools.com/hmac