HKDF 是 TLS1.3 中定义的基础组件,该组件主要分为两个部分 HKDF-Extract 和 HKDF-Expand 部分,这两个部分一般情况混合使用。在 TLS1.2 当中,定义了一个叫做 PRK 的组件,做的实际上就是 HKDF-Expand 的作用。HKDF 的基础定义可以去看 RFC5869,具体的实现部分不再赘述。
TLS1.3 中除了使用 HKDF-Extract 和 HKDF-Expand 之外,还定义了其它函数,其数据结构为: HKDF-Expand-Label(Secret, Label, Context, Length) = HKDF-Expand(Secret, HkdfLabel, Length)
Where HkdfLabel is specified as:
struct {
uint16 length = Length;
opaque label<7..255> = "tls13 " + Label;
opaque context<0..255> = Context;
} HkdfLabel;
Derive-Secret(Secret, Label, Messages) =
HKDF-Expand-Label(Secret, Label,
Transcript-Hash(Messages), Hash.length)
可以看出本质上 Derive-Secret 就是把拼接好的 Label(不同的 secret 种类加不同的 Label)当成 info 字段输入到,Message 报文就是我们输入的 ClientHello 等报文当做环境也就是 Context 输入到 HKDF-Expand 里。进而获得我们想要的各种不同 key.
ok,来看看 psk-only 模式下如何获得各种秘钥。
HKDF-Extract(PSK,0)==>Early Secret.
PSK 是 IKM,SALT 是0,计算产生 RKM--Early Secret.Early Secret 参与到不同种类的 secret 当中去,值得注意的是这里 secret 的产生并不像网上说的计算多次,而是根据不同的种类计算不同的 secret.
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.