網站首頁 編程語言 正文
HKDF叫HMAC-based KDF(key derivation function),基于HMAC的密鑰推導函數,所以我們先認識HMAC算法。
1. HMAC
基于一個共同密鑰,在兩個對端之間提供消息完整性確認的機制叫"message authentication codes(MAC),消息認證碼"。其實就是將消息進行hash,得到的hash值附加到消息之后,隨消息一起發送,對端接收后,同樣進行hash,來驗證消息是否被篡改——關鍵點在不同數據得到的hash值一定不同——其中得到的hash值就是MAC(在別的語境里邊也叫消息摘要)。另外,為了避免使用同樣的hash函數對相同數據進行操作總是得出同樣的摘要,額外加入一個密鑰,這樣使用不同密鑰就可以得出不同的MAC,當然,這個密鑰是兩個對端都知道的。這樣,我們就得到了基于加密hash的消息完整性認證的算法——Hash-based MAC。
HMAC定義如下:
輸入:
- 使用的加密hash函數H,輸出長度為hashLen
- 使用的密鑰K,長度hashLen <= Klen <= 64,如果K的長度超過64,則先用hash函數進行一次hash,用得到的值作為K
- 需要認證的數據text
輸出:
- 消息完整性認證碼HMAC
過程:
- 定義 ipad = 64個0x36, opad = 64個0x5c
- HMAC = HMAC-Hash(H, K, text) = H(K XOR opad, H(K XOR ipad, text))
目的:
- 為text生成一個HMAC消息完整性認證碼,輸出長度就是hash函數的輸出長度
2. HKDF
HKDF的主要目的使用原始的密鑰材料,派生出一個或更多個能達到密碼學強度的密鑰(主要是保證隨機性)——就是將較短的密鑰材料擴展成較長的密鑰材料,過程中需要保證隨機性。
HKDF包含兩個基本模塊,或者說兩個基本使用步驟:1. 提取 Extract, 2. 擴展 Expand。
- 提取:使用原始的密鑰材料,派生出一個符合密碼學強度的偽隨機密鑰
- 擴展:使用第1步驟提取出來的偽隨機密鑰,擴展出指定長度的密鑰(同時保證隨機性)。
HKDF-Extract
輸入:
- HMAC使用的hash函數H,H輸出長度是hashLen
- 原始密鑰材料IKM(input keying material)
- 另外的隨機源salt, 如果沒有,默認是hashLen長度的0串
輸出:
- hashLen長度的偽隨機密鑰prk(pseudorandom key)
過程:
- prk = HKDF-Extract(H, salt, IKM) = HMAC-Hash(H, salt, IKM)
- 其實就相當于用salt作為HMAC-Hash的K,對IKM進行消息完整性認證
目的:
使用salt增加IKM的隨機性
HKDF-Expand
輸入:
- HMAC使用的hash函數H,H輸出長度是hashLen
- 第一步生成的PRK
- 另外的隨機元info,可以為空
- 期望生成的密鑰長度L
輸出:
- L長度的OKM(output keying material)
過程:
N = ceil(L/hashLen)
T = T(1) || T(2) || T(3) || … || T(N)
OKM = T的前L字節
T(0) = 空
T(1) = HMAC-Hash(PRK, T(0) || info || 0x01)
T(2) = HMAC-Hash(PRK, T(1) || info || 0x02)
T(3) = HMAC-Hash(PRK, T(2) || info || 0x03)
…
目的:
- 將PRK擴展到指定長度L,同時保持密碼學強度(隨機性)
3. 總結
- HKDF是密鑰推導算法,根據一個原始密鑰材料,推導出指定長度的密鑰;
- HKDF基于HMAC;
- HMAC是基于加密hash函數的消息完整性認證算法,主要目的是認證消息完整性。在這里被用于增加原始密鑰材料的隨機性;
- HKDF包含兩步:(1) 提取Extract, (2) 擴展Expand;
- HKDF-Extract就是HMAC,取IKM的認證碼,也就相當于用額外的隨機源salt(Key)增加了IKM(text)的隨機性;
- HKDf-Expand就是將短密鑰變長,同時保證隨機性。
原文鏈接:https://blog.csdn.net/qq_32907491/article/details/131515023
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-08-28 ubuntu安裝samba文件共享
- 2022-08-17 解決Git推送錯誤non-fast-forward的方法_相關技巧
- 2022-07-12 Linux虛擬機設置雙網卡
- 2022-09-03 golang架構設計開閉原則手寫實現_Golang
- 2022-05-20 C#隊列的簡單使用_C#教程
- 2022-03-17 C#實現多文件打包壓縮(.Net?Core)_C#教程
- 2022-07-06 C++實現中值濾波的示例代碼_C 語言
- 2022-10-07 使用Cargo工具高效創建Rust項目_相關技巧
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支