六十七、进阶篇-浅谈密钥协商算法

前文说过,对称加密算法虽然有很多的算法和加密机制,但主要用于加密和解密,而非对称加密算法的功能比较多,可以进行加密解密、密钥协商、数字签名等,加密解密我们已经简单讨论过,本文主要探究密钥协商这一块

密钥协商是理解HTTPS的核心一环,还请读者朋友们关注。

六十七、进阶篇-浅谈密钥协商算法

一、密钥

学习了对称加密和公开密钥算法后,我们知道,密钥是最关键的因素,一旦被截获,密文就能够被解密。

密钥长度则是最重要的属性,直接关系到密钥的安全度,如果密钥长度过短,很容易受到暴力攻击。

而我们直观的感受,密钥就是一串字符串,实际上密钥足够长也不代表安全,密钥应该是随机、无法预测的。

所以密钥最关键的两个特性是:

  • 足够的长度,达到一定长度才能保证算法安全性。

  • 不可预测性,不能是简单的数字、字母组合,否则即使长度足够,密钥本身也容易被破解。

基于伪随机数生成器生成的密钥足够随机,很难预测,是比较受认可的生成密钥的方式。

六十七、进阶篇-浅谈密钥协商算法

二、密钥存储和传输

接下来就是密钥的存储和传输,简单的,我们可以使用静态密钥。

一般情况下,密钥在一段时间内不会改变,我们可以称之为长期密钥,这个密钥一般会存储在数据库、文件或专用设备中,一旦泄露,将面临严重的安全问题,这就是静态密钥存储面临的一个问题。

接下来继续看,如果这个静态密钥要给别人用,该怎么给呢?

简单的方法,我们可以以口头、邮件的方式传输密钥。

比如我们开发了一个HTTP API接口,为了保证机密性,使用对称加密算法加密该接口的内容,由于接口的使用方并不多,开发者也熟识使用方的身份,可以给每个使用方分配一个密钥,然后将密钥存储到数据库中,最后以邮件的方式告知每个使用者的密钥,这种分配、存储、传输密钥的解决方案相对来说非常简单有效,有一定的应用场景,但一旦邮件泄露就存在很大的安全风险。

但对于更加通用的场景,比如像淘宝、京东这样的网站,用户去访问时还要保证数据的机密性,需要密钥加密数据,但是密钥又该如何安全地传输给客户端呢?

这么多的用户,显然不能以口头或邮件形式传输密钥了,但是数据又必须加密保护起来,该怎么办呢?

此时就出现了动态密钥,每个用户每次发起的TCP连接会传输一个临时的动态密钥,依靠此密钥对数据进行加密保护,但是动态密钥如何保护呢?仿佛进入了死循环。

为了密钥的机密性,我们采取密码学中的密钥协商算法。

六十七、进阶篇-浅谈密钥协商算法

三、会话密钥

我们已经清楚了问题的棘手,静态密钥存在很多的问题:比如存储在数据库,一旦数据库信息被窃取后果不堪设想;也很难解决TOC的业务场景,由于用户量巨大,密钥的分配和传输问题亟需解决。

而密钥协商算法就可以解决密钥的分配、存储和传输等问题。

在网络通信中,为了加密解密数据,可以采用动态密钥,也叫做会话密钥,这个密钥具有如下特点:

  • 在数据通信之前,客户端和服务端协商出此会话密钥,这个密钥只有客户端和服务端两者知道,不能泄露;

  • 会话密钥相对于静态密钥,无需存储,一旦服务端和客户端连接关闭,该密钥就会消失,实际上此密钥只会临时出现在内存中,相对于静态密钥需要存储在磁盘等硬件上安全很多

依靠密钥协商算法,则可以安全地传输会话密钥,读者朋友们一定迫不及待地想了解密钥协商算法是如何实现的了。

下面分别使用RSA算法和DH算法来看如何协商会话密钥。

六十七、进阶篇-浅谈密钥协商算法

四、RSA密钥协商算法

直接来看RSA密钥协商算法是如何工作的:

六十七、进阶篇-浅谈密钥协商算法

  • 客户端初始化连接服务器端,服务器发送 RSA 密钥对的公钥给客户端;

  • 客户端生成一个随机值,这个值必须是随机的,不能被攻击者猜出,这个值就是会话密钥

  • 客户端使用服务器 RSA 密钥对的公钥加密会话密钥 ,并发送给服务器端,由于攻击者没有服务器的私钥,所以无法解密会话密钥;

  • 服务器端用它的私钥解密出会话密钥;

  • 至此双方完成连接,接下来服务器端和客户端可以使用对称加密算法和会话密钥加密解密数据;

接下来,我们来简单谈谈RSA密钥协商算法的优点和缺点。

优点很明显:每次会话密钥都不同、无需存储、会话密钥不长也不会有太大的RSA性能问题。总之,达到我们密钥分配、存储和安全传输的目的!这个方案应用十分广泛。

不过缺点也很明显:会话密钥的产生并不是“协商”出来,它的生成完全是由客户端来决定,如果客户端没有按照标准算法生成会话密钥的话,很容易受到暴力攻击。

六十七、进阶篇-浅谈密钥协商算法

五、DH密钥协商算法

DH算法,全称是Diffie-Hellman算法,它也是一种公开密钥算法,它的历史比RSA公开密钥算法更悠久。

我们知道,RSA的会话密钥严格来说并不是协商出来的,而是完全由客户端决定,这一点会存在风险。

DH密钥协商算法则顾及了客户端和服务端,通信双方的任何一方无法独自计算出一个会话密钥。

DH核心点:通信双方各自保留一部分关键信息,再将另外一部分信息告诉对方,双方有了全部信息才能共同计算出相同的会话密钥。

我们注意到,在客户端和服务端协商密钥时,需要互相传递消息,即使这个消息被监听,攻击者也无法计算出会话密钥。

以上就是DH密钥协商算法的核心原理和优势,下面我们来看下DH密钥协商算法的具体过程。

在使用 DH 算法之前,先要生成一些公共参数,这些参数是公开的,无须担心攻击者能够看到这些参数值,这些参数可以由客户端或者服务器端生成,一般由服务器端生成。

其中,由服务端生成的两个公共参数是:p和g,p是一个很大的质数,建议长度在1024比特以上,这个长度也决定了DH算法的安全程度,g表示为一个生成器,值很小,可以是2或者5。

六十七、进阶篇-浅谈密钥协商算法

  • ①客户端连接服务端,请求DH参数;

  • ②服务端生成DH参数p和g,服务端根据这些公开参数生成随机数b,这个随机数b即服务端的私钥,然后计算Ys=(g^b) mod p ,Ys即服务端公钥

  • ③服务端将DH公开参数和公钥Ys发给客户端;

  • ④客户端根据DH公开参数生成一个随机数a,这个随机数a即客户端的私钥,然后计算Yc=(g^a) mod p,Yc即客户端公钥

  • ⑤客户端将Yc发送给服务端;

  • 最后,客户端根据Ys和a计算出一个会话密钥Z,服务端根据Yc和b计算出一个会话密钥Z,Z相等,即会话密钥,协商结束

整个过程中,只有服务端的b和客户端的a是不能泄露的,其他参数是公开的。

六十七、进阶篇-浅谈密钥协商算法

六、椭圆曲线密码学

介绍了RSA密钥协商算法和DH密钥协商算法后,为什么还要学习椭圆曲线密码学呢?

我们前面说过,提高安全性的主要手段之一就是增加密钥的长度。

而公开密钥算法是一个O(n)操作,n就是密钥长度,n越大性能越低。

为了保障密钥长度的同时能提高性能,故引入椭圆曲线密码学解决此矛盾,椭圆曲线密码学英文全称是:Elliptic Curve Cryptography,简称为ECC。

ECC可以与其他公开密钥算法相结合,形成更快、更安全的公开密钥算法,比如ECC结合DH密钥协商算法组成ECDH密钥协商算法。

由于背后的数学原理比较复杂,这里简单做下介绍,而不去深入背后的数学原理。

我们知道,在DH算法中,服务端和客户端分别生成密钥对,依赖的就是公开参数p和g。

如服务端:服务端生成DH参数p和g,服务端根据这些公开参数生成随机数b,即服务端的私钥,然后计算Ys=(g^b) mod p ,Ys即服务端公钥。

在ECDH中,首先获取一个随机数k,称之为私钥,kg的结果就是公钥,g是椭圆曲线上的基点,公钥也是椭圆曲线上的一个点。

简单来说,在ECDH中,k就是私钥,g就是基点,kg基于公式运算最终得到公钥,反之,通过公钥很难计算出k。

不能完全理解ECC原理没有关系,只要知道以上这个基本结论即可。

原文始发于微信公众号(幕后哈土奇):六十七、进阶篇-浅谈密钥协商算法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/113174.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!