【密码学】一文读懂HKDF

简介: 我这又来水一篇文章,来聊一下HKDF(基于HMAC的密钥导出函数)。密钥派生函数是密钥管理的组成部分,他的目标是通过一些初始的数据派生出来密码学安全的随机密钥。

【密码学】一文读懂HKDF


$21WC@R%~M`J4]6IVG]JM}N.jpgHKDF

我这又来水一篇文章,来聊一下HKDF(基于HMAC的密钥导出函数)。密钥派生函数是密钥管理的组成部分,他的目标是通过一些初始的数据派生出来密码学安全的随机密钥。


前置知识

因为这个密钥导出函数是基于HMAC的,因此呢,需要先来回顾一下HMAC的先关知识。有关HMAC的详细知识,读者可以自行回顾一下我之前写过的HMAC的相关文章,这里贴一张之前文章当中出现的图。

{LTL~)R8_FBZSO]F@FQE{4B.pngHMAC结构


算法流程

对于HKDF算法主要分为如下两个步骤

Extract

对于Extract方法来说,他的输入实际上就是HMAC的输入,如果salt不传的话,默认是哈希长度相等的0字节序列。然后 PRK = HMAC(salt, IKM)

Expand

对于扩展算法来说,这个就是生成整个密钥流的关键函数了,如下图所示:

FP1XCNU]0BE94LEZ)F1M8(S.pngHKDF-Expand

最终输出 T(1) || T(2) ...根据具体长度输出所需要生成的密钥。


代码实现

这里借鉴了Go的官方库的写法,感觉Go官方库实现的这些代码还是相当不错的。

package hkdf
import (
  "crypto/hmac"
  "hash"
  "io"
)
type HKDF struct {
  hashFunc hash.Hash
  size     int
  info    []byte
  counter byte
  prev []byte
  buf  []byte
}
// Extract HKDF-Extract(salt, IKM) -> PRK
func Extract(hash func() hash.Hash, secret, salt []byte) []byte {
  if salt == nil {
    salt = make([]byte, hash().Size())
  }
  hashFunc := hmac.New(hash, salt)
  hashFunc.Write(secret)
  return hashFunc.Sum(nil)
}
func (f *HKDF) Read(p []byte) (int, error) {
  need := len(p)
  n := copy(p, f.buf)
  p = p[n:]
  for len(p) > 0 {
    f.hashFunc.Reset()
    f.hashFunc.Write(f.prev)
    f.hashFunc.Write(f.info)
    f.hashFunc.Write([]byte{f.counter})
    f.prev = f.hashFunc.Sum(f.prev[:0])
    f.counter++
    f.buf = f.prev
    n = copy(p, f.buf)
    p = p[n:]
  }
  f.buf = f.buf[n:]
  return need, nil
}
// Expand HKDF-Expand(PRK, info, L) -> OKM
func Expand(hash func() hash.Hash, prk, info []byte) io.Reader {
  hashFunc := hmac.New(hash, prk)
  return &HKDF{hashFunc, hashFunc.Size(), info, 1, nil, nil}
}
func New(hash func() hash.Hash, secret, salt, info []byte) io.Reader {
  prk := Extract(hash, secret, salt)
  return Expand(hash, prk, info)
}


相关文章
|
存储 Rust 并行计算
【密码学】一文读懂XTS模式
这篇文章的灵感来源于我偶然翻到的一个某U盘有关磁盘加密的一个介绍(这一篇不是广告蛤), 然后发现这个模式我之前还真没遇到过,因此呢,就学习了一下,就出来了这一篇文章。
5266 0
【密码学】一文读懂XTS模式
|
算法 数据安全/隐私保护
【密码学】一文读懂Whirlpool
首先呢,祝大家今晚节日快乐,Whirlpool是由Vincent Rijmen(高级加密标准的联合创始人)和Paulo S.L.M.Barreto设计的,后者于2000年首次提出了它。
1119 0
【密码学】一文读懂Whirlpool
|
Rust 算法 安全
【密码学】一文读懂MurMurHash2
上次我们聊过了一代的MurMurHash算法,是的,我又来水文章了,今天呢,接着来聊一下二代的MurMurHash算法,二代算法的整体结构实际上和一代算法差不太多,只是对于每一轮数据的处理过程当中的运算有一些差异,算法的来源依然是来自于Google官网给提供的源码,对着源码看的结构,对于这个算法呢,有两个版本,一个是32位的,一个是64位的,对于32位的算法和64位的算法,区别在于两个初始的魔数不同,整体运算过程还是十分相似的。
2224 0
【密码学】一文读懂MurMurHash2
|
Rust 算法 网络安全
【密码学】一文读懂CMAC
介于上一篇文章比较水,然后这个和上一篇也比较相似,CMAC是为了解决DAA当中安全性不足的问题而出现的,这个算法一共有三个密钥,K, K1, K2, 其中K1和K2可以由K导出,接下来就来一起看一下CMAC的具体过程吧,这一篇文章其实也不长。
3786 0
【密码学】一文读懂CMAC
|
Rust 算法 Go
【密码学】一文读懂MurMurHash3
本文应该是MurMurHash算法介绍的最后一篇,来一起看一下最新的MurMurHash算法的具体过程,对于最新的算法来说,整个流程和之前的其实也比较相似,这里从维基百科当中找到了伪代码,也就不贴出来Google官方给出的推荐代码了,先来看一下维基百科给出的伪代码,这里只有32位的伪代码。
2191 0
【密码学】一文读懂MurMurHash3
|
Web App开发 Rust 算法
【密码学】一文读懂ChaCha20
好久没写新的加密算法的原理了, 这次所选取的加密算法结构比较简单, 一起来看一下吧。
7809 0
【密码学】一文读懂ChaCha20
|
Rust 算法 数据安全/隐私保护
【密码学】一文读懂XTEA加密
本篇文章,我们来看一下上一次讲过的TEA加密算法的一个升级版XTEA, 相比于TEA, XTEA的安全性显然是更高的,其中的过程要比TEA稍微复杂一点点。
1285 0
【密码学】一文读懂XTEA加密
|
存储 安全 算法
为什么人人都要懂点密码学
人类进入二十一世纪以来,随着计算机和移动设备的普及高速发展,我们的社会已经高度信息化,为了防止信息被窃取、修改,就需要对信息的存储、传递进行加密处理,而加密就需要使用到加密算法,解密需要使用密码才可以看到原文。
236 1
|
算法 搜索推荐 安全
【密码学】一文读懂CCM
本文简单介绍了CCM模式下的认证和加密机制,实际上这个是AES-CTR模式和CMAC的一个组合,如果理解了前面这两个,本文应该还是比较好理解的。
3417 0
【密码学】一文读懂CCM
|
Rust 算法 数据安全/隐私保护
【密码学】一文读懂XXTEA
本篇文章,我们接着来看TEA算法的升级版,这个实际上是XTEA算法的升级版,这也是TEA系列算法的最后一篇了,这个算法的祖孙三个就都结束了
【密码学】一文读懂XXTEA