文章分享

开放、平等、协作、快速、分享

当前位置:首页>文章分享

PSK在TLS中的应用

摘录:HCTech 无锡和控电子   时间:2020-08-07   访问量:3457

PSK在TLS中的应用



PSK的目的

  我们都知道TLS需要依赖非对称算法(RSK,EC,DS,DH...)完成秘钥交换,身份认证的功能,但是非对称算法的耗时和耗计算资源的特性在对资源或者耗时敏感的场景下,你就想把他优化掉。本文我们就简绍一种TLS标准本身提供的优化方式:PSK.


PSK的江湖地位

  PSK的方式应该是最古老的一种秘钥交换和认证方式,但是它在TLS中的江湖地位是比较低的,从最早的非正式的优化方案到有了自己的RFC编号RFC4279(December 2005)对比TLS的历史

之前搞TLS的过程中,PSK的概念有所了解,但是一直觉得他没什么用处,就大致看了一下实现,没深究。但是TLS1.3中居然设计到了PSK的概念,我想有必要在这里总结一下,以免忘记。(其实就我个人而言,要理解TLS 1.3的session resume原理,是不需要理解PSK的,anyway,就当记录了)

RFC 4279中详细描述了各个方面。

PSK的三种类型

PSK-only

简单的说,就是client写死一个key,server写死一个key,当然这两个key是一样的。 
这个key被用来当做pms(pre master key)的一部分。当然,client 和 server也可以配置多个key,为了决定使用哪个key,每个key对应一个psk identity(字符串标识)。 
客户端会发送client key exchange,client key exchange中携带有一个字符串:identity,server收到identity,查找identity对应的key,这样就能知道客户端使用的是那个key了。

我们知道,其他的非PSK算法,client key exchange解出来的48字节的值,就是pms,但是PSK时,不一样,假设我们设置的key是”0x12345678”,4字节,那么我们的pms是: 
00 04 00 00 00 00 00 04 12 34 56 78,一共12字节。

RFC上这么描述premaster 的生成:

The premaster secret is formed as follows: if the PSK is N octets   long, concatenate a uint16 with the value N, N zero octets, a second
   uint16 with the value N, and the PSK itself.
struct {
             opaque other_secret<0..2^16-1>;
             opaque psk<0..2^16-1>;
         };

      Here "other_secret" either is zeroes (plain PSK case) or comes      from the Diffie-Hellman or RSA exchange (DHE_PSK and RSA_PSK,
      respectively).

这里,我们的other_secret填写的是0。之后的流程,就如其他算法一样,这里不再描述。

报文如下: 
这里写图片描述

其中: 
client key exchange如下: 
这里写图片描述

正如上面所说,client key exchange携带的是identity,其实就是key对应的标识。服务器肯定也有该标识对应的key,这样才能协商成功。

PSK-RSA

这个我个人觉得比较累赘,RFC上说了他的用处,大家可以看看,我没啥耐心。

PSK-only中,key是两端配置写死的,那么在PSK-RSA中呢,key也需要配置。

先看报文: 
这里写图片描述 
报文的流程,和标准的RSA流程一模一样。 
我们细看client key exchange报文: 
这里写图片描述 
它和标准的就多了一个identity域,其他的比如Encrypted premaster就和标准的算法一样。 
对于标准的RSA,Encrypted premaster包含了48字节(去掉padding后)的random,用作pre master key,显然PSK之所以叫做PSK,我们肯定不能简简单单的和标准RSA一样,把Encrypted premaster解开,提取出的值就是pre master key。

PSK-RSA中的pre master key 其实定义和PSK-only中的一样

struct {
             opaque other_secret<0..2^16-1>;
             opaque psk<0..2^16-1>;
         };

      Here "other_secret" either is zeroes (plain PSK case) or comes      from the Diffie-Hellman or RSA exchange (DHE_PSK and RSA_PSK,
      respectively).

举个例子,Encrypted premaster我们解密开是a-xA-X,48字节,那么我们的pre master key 就是 
00 30 a-xA-X 00 04 12 34 56 78 ,共56字节。 
剩余的流程,和其他标准算法一样。

PSK-DHE、PSK-ECDHE

这个就不多说了,握手流程和标准的DHE和ECDHE一样,只是client key exchange和server key exchange不一样罢了。 
注:server key exchange 有个”PSK identity hint”这里没细究。

通过标准的握手,从pubkey中提取出标准的pre msater key,然后添加我们设置的key,就如PSK-RSA一样就行了。


上一篇:TLS协议、PKI、CA

下一篇:TLS 1.3概述

在线咨询

点击这里给我发消息 售前咨询专员

点击这里给我发消息 售后服务专员

在线咨询

免费通话

24小时免费咨询

请输入您的联系电话,座机请加区号

免费通话

微信扫一扫

微信联系
返回顶部