Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >非对称密钥沉思系列(4):密钥交换

非对称密钥沉思系列(4):密钥交换

原创
作者头像
bowenerchen
修改于 2023-01-04 06:33:54
修改于 2023-01-04 06:33:54
7.2K13
举报
文章被收录于专栏:数安视界数安视界

密钥交换的概念

密钥交换,也有称作密钥协商,这套机制,最主要的作用是用来得到通信双方的临时会话密钥。

这里的临时会话密钥,可以理解为对称加密的密钥,只不过他的有效性仅限于一次会话链接,并不是长期有效的。

前面其实我们分析过,分对称密钥比如RSA也是可以做加解密的,那么在实际的通信过程比如TLS中,为什么还需要生成临时的对称密钥呢?

这里最核心的原因有两个:

  • 非对称密钥加解密,对于数据量有比较严格的要求,比如RSA算法,在使用OAEP填充模式时,每次最多只能加密190字节。
    OAEP明文长度
    OAEP明文长度
  • 非对称密钥加解密的性能相对于对称密钥,差了很多,在这实际的业务流加解密中,无法进行业务落地。 因此在实际的工程化上,一般使用非对称密钥进行数据密钥的协商与交换,而使用数据密钥与对称加密算法进行数据流的加解密保护。

基于RSA的密钥交换

简单的密钥交换过程

基于RSA进行密钥交换,基于非对称密钥的两个基本特性:

  • 使用公钥加密、私钥解密,且此过程无法逆向
  • 公钥是对外公开的,私钥是私密不公开的

客户端与服务端

在简单的密钥交换场景中,有两个基本角色,客户端与服务端。

客户端与服务端进行正常的业务流通信前,总是需要先线上一把数据密钥,用于给业务流进行加解密。

这里我们约定服务端总是权威的,其公钥是被所有客户端所感知的,客户端是任意的,没有身份上的要求,客户端总是主动发起于服务端的通信,并且服务端总是回复可信的数据给客户端。

服务端分发公钥给客户端
服务端分发公钥给客户端

客户端是密钥生成的决定方

在基于RSA的密钥交换体系中,总是由客户端来生成密钥。

这是因为,客户端总是能够获取到服务端的公钥,由客户端生成随机密钥,然后由服务端使用私钥解密,这样可以保证随机密钥的保密性。

随机密钥的加密与传输
随机密钥的加密与传输

服务端使用私钥获取随机密钥明文

私钥总是由服务端私密保存,绝对不会公开。

这是基于RSA进行数据安全加密的前提。

也是基于RSA进行密钥交换的基础。

随机密钥的解密与使用
随机密钥的解密与使用

服务端在使用私钥对随机密钥密文解密后便默认承认了与客户端使用的是同一把随机密钥。

随后的业务流数据便使用这把随机密钥进行数据通信。

针对RSA密钥交换的中间人攻击

客户端无法区分公钥来源

客户端是无法区分公钥来源的,这是RSA可能被中间人攻击的前提。

客户端只能够使用公钥对随机密钥进行加密,但是,这份公钥究竟是属于真实服务端,还是属于中间人的,客户端自己无法区分。

中间人迷惑客户端
中间人迷惑客户端

中间人对客户端的拦截

一旦客户端接受了中间人的公钥,那么就意味着客户端默认了中间人是真实的服务端。

那么在前面我们描述的数据密钥的交换过程,就可以被中间人完全监听甚至是篡改。

拦截客户端消息
拦截客户端消息

客户端在生成随机密钥并加密后,其消息会被中间人全部监听,由于客户端使用的是中间人的公钥,因此即使随机密钥被加密,中间人还是可以完全获取其明文。

中间人对服务端的迷惑

中间人同样可以对服务端进行迷惑。

比如,在使用自己的私钥对随机密钥解密后,再试用服务端公钥对随机密钥加密,然后发送给服务端。

此时的服务端,其实也无法区分,发送数据过来的,究竟是客户端还是中间人。

迷惑服务端
迷惑服务端

中间人对消息进行监听

在RSA密钥交换过程中,中间人需要保证:

  1. 截取客户端的真实数据密钥
  2. 迷惑服务端,使其相信中间人投递的数据密钥就是客户端产生的真实数据密钥 完成上述两个步骤后,中间人就可以进行双向的消息监听甚至篡改。
    中间人消息监听
    中间人消息监听

避免RSA的中间人攻击

防止中间人攻击的方法实际上就是身份证认证方式,目前主流方式就是数字签名的方式。

在前面的文章《非对称密钥沉思系列(3):公钥、签名与证书》中我们聊了证书与身份认证的一些底层逻辑。

在RSA的这种密钥交换过程中,同样可以很好地应用证书来进行身份的鉴别与认证。

对服务端的身份认证
对服务端的身份认证

在对服务端的认证过程中,最重要的仍然是要解决三个问题:

身份认证的关键
身份认证的关键

这里细节就不赘述了,在前文中有详细描述,感兴趣的可以翻一下《非对称密钥沉思系列(3):公钥、签名与证书》

关于RSA交换的更多思考

在前面的描述中,我们其实只是着重的描述了客户端使用公钥加密随机密钥,然后服务端使用私钥对随机密钥解密的过程。其实结合《非对称密钥沉思系列(2):聊聊RSA与数字签名》中的内容,我们在做随机密钥的交换时,还可以结合对随机密钥的HMAC等手段,保证随机密钥的不被篡改。这里感兴趣的同学可以自己思考下。

密钥交换协议DH

前面我们聊了很多RSA,但其实,RSA更侧重于非对称密钥算法,主要功能其实还是在于加密与解密。

而密钥交换协议DH,是专门用于协商密钥生成的。

RSA可以用来传输信息,DH更适合用来协商密钥。

DH算法解决了密钥在双方不直接传递密钥的情况下完成密钥交换,这个神奇的交换原理完全由数学理论支持。

由于DH系列算法涉及比较复杂的数学推理运算,这里不做过多展开讲解,感兴趣的同学可以翻阅相关RFC文档等。

最原始的DH算法并不能对抗MIMT(Man-in-the-middle attack),所以一般需要配合签名技术,不配合签名技术的DH称为,DH-ANON;

配合RSA签名的称为,DH-RSA;

配合DSA签名的称为,DH-DSA;

配合ECDSA签名的称为,DH-ECDSA;

总的来说,DH协议也怕中间人攻击,一般来说,也需要配置数字证书来进行身份的认证。

关于Forward security前向保密

Forward security前向保密,最初用来定义绘画密钥交换协议的一种安全性。即使长期密钥已经泄露,也不会影响之前的会话密钥的泄露,也就不会暴露之前的会话内容。

DH和ECDH算法为了实现前向安全,变种加入了另一个随机变量ephemeral key得到新的算法DHE、ECDHE。

RSA、DH和DSA都是基于整数有限域离散对数来实现。

ECC和ECDH都是基于椭圆曲线的离散对数难题来实现的。

现在实际使用中,优先选择 ECDHE>DHE> DH,RSA ...等。

python库中关于DH协议使用的示例

代码语言:txt
AI代码解释
复制
from typing import Tuple

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import dh
from cryptography.hazmat.primitives.asymmetric.dh import DHParameters, DHPrivateKey, DHPublicKey
from cryptography.hazmat.primitives.kdf.hkdf import HKDF


def data_key_exchange(owner_pri_key: DHPrivateKey, peer_pub_key: DHPublicKey) -> bytes:
    shared_key = owner_pri_key.exchange(peer_pub_key)
    derived_key = HKDF(algorithm = hashes.SHA256(),
                       length = 32,
                       salt = None,
                       info = b'handshake data',
                       backend = default_backend()).derive(shared_key)
    print("derived_key:{}, length:{}".format(list(derived_key), len(derived_key)))
    return derived_key


def generate_common_parameters() -> DHParameters:
    parameters = dh.generate_parameters(generator = 2, key_size = 2048,
                                        backend = default_backend())
    return parameters


def generate_dh_key(parameters: DHParameters) -> Tuple[DHPrivateKey, DHPublicKey]:
    private_key = parameters.generate_private_key()
    public_key = private_key.public_key()
    return private_key, public_key


if __name__ == '__main__':
    param = generate_common_parameters()
    a_pri_key, a_pub_key = generate_dh_key(param)
    b_pri_key, b_pub_key = generate_dh_key(param)
    a_data_key = data_key_exchange(a_pri_key, b_pub_key)
    b_data_key = data_key_exchange(b_pri_key, a_pub_key)
    print(a_data_key == b_data_key)

最终生成的密钥数据:

代码语言:txt
AI代码解释
复制
derived_key:[3, 139, 194, 229, 249, 124, 131, 14, 141, 172, 168, 29, 26, 152, 63, 253, 227, 234, 189, 101, 130, 192, 139, 99, 50, 8, 153, 75, 31, 247, 200, 24], length:32
derived_key:[3, 139, 194, 229, 249, 124, 131, 14, 141, 172, 168, 29, 26, 152, 63, 253, 227, 234, 189, 101, 130, 192, 139, 99, 50, 8, 153, 75, 31, 247, 200, 24], length:32
True

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
13 条评论
热度
最新
一下子就懂了
一下子就懂了
回复回复1举报
学习了
学习了
回复回复1举报
好文
好文
回复回复1举报
通俗易懂!深度好文
通俗易懂!深度好文
回复回复1举报
点赞!!!
点赞!!!
回复回复1举报
深入浅出,写的很透。👏
深入浅出,写的很透。👏
回复回复1举报
好文~
好文~
回复回复1举报
日常催更,请加大力度
日常催更,请加大力度
回复回复1举报
都是知识啊
都是知识啊
回复回复1举报
调理清晰通俗易懂
调理清晰通俗易懂
回复回复1举报
加载更多
推荐阅读
编辑精选文章
换一批
全网最透彻HTTPS(面试常问)
每篇文章都希望你能收获到东西,这篇将带你深入 HTTPS 加解密原理,希望看完能够有这些收获:
敖丙
2020/05/26
1.6K0
全网最透彻HTTPS(面试常问)
基于 TLS 1.3的微信安全通信协议 mmtls 介绍(上)
张绍文
2017/07/20
20.1K1
基于 TLS 1.3的微信安全通信协议 mmtls 介绍(上)
keyless原理
ssl协议是基于密码学的基础上,解决通信双方加密信道和身份鉴权的安全问题。ssl协议的算法本身是公开的,但是算法本身的输入参数(key)是由通信双方私自保存。在非对称加密中,服务端保存有一对公钥和私钥对,用于服务端鉴权和加密通信。服务端的私钥泄露会导致恶意攻击者伪造虚假的服务器和客户端通信。特别是源站把业务迁移到云或者CDN上,私钥的安全保存要求更高。
mariolu
2018/10/26
5.6K1
一文读懂https中密钥交换协议的原理及流程
http与https区别:HTTP 由于是明文传输,所以在安全性上存在以下三个风险:
绿盟科技研究通讯
2022/06/06
8.3K0
一文读懂https中密钥交换协议的原理及流程
对称加密、非对称加密、RSA、消息摘要、数字签名、数字证书与HTTPS简介
对称加密算法使用的加密和解密的密钥一样,比如用秘钥123加密就需要用123解密。实际中秘钥都是普通数据在互联网传输的,这样秘钥可能会被中间人截取,导致加密被破解。其过程如下:
恋喵大鲤鱼
2019/03/11
12.2K3
对称加密、非对称加密、RSA、消息摘要、数字签名、数字证书与HTTPS简介
PKI - 02 对称与非对称密钥算法
对称密钥算法和非对称密钥算法是两种常见的加密技术,它们在加密和解密数据时采用不同的方法。
小小工匠
2024/05/25
1540
PKI - 02 对称与非对称密钥算法
JavaEE初阶---网络原理(六)---HTTPS加密(对称,非对称,中间人攻击,公证机构)
当前我们的这个网络上面的绝大部分内容都是使用的这个HTTPS协议,相较于我们之前学习的这个HTTP协议,这个HTTPS就是在原来的这个基础上面进行了内容的加密;
阑梦清川
2025/02/24
920
JavaEE初阶---网络原理(六)---HTTPS加密(对称,非对称,中间人攻击,公证机构)
几幅图,拿下 HTTPS
我很早之前写过一篇关于 HTTP 和 HTTPS 的文章,但对于 HTTPS 介绍还不够详细,只讲了比较基础的部分,所以这次我们再来深入一下 HTTPS,用实战抓包的方式,带大家再来窥探一次 HTTPS。
小林coding
2021/01/12
7230
几幅图,拿下  HTTPS
HTTPS 和 SSL/TLS 协议:密钥交换(密钥协商)算法及其原理
前一篇介绍了 SSL/TLS 的身份认证机制。这个机制是为了防止攻击者通过【篡改】网络传输数据,来假冒身份,以达到“中间人攻击/MITM”的目的。   而今天要聊的“密钥协商机制”是:(在身份认证的前提下)如何规避【偷窥】的风险。   通俗地说,即使有攻击者在偷窥你与服务器的网络传输,客户端(client)依然可以利用“密钥协商机制”与服务器端(server)协商出一个用来加密应用层数据的密钥(也称“会话密钥”)。
全栈程序员站长
2021/06/17
10.3K0
非对称加密与安全证书看这一篇就懂了
前几日做支付对接时,被对方文档中的加密方式搞晕乎了一会。意识到证书加密方面的理解不够深入,事后查阅参考资料补习一波。本文是根据期间的学习,以及长期以来的实践做出的总结。
用户1263954
2018/07/30
1.8K0
非对称加密与安全证书看这一篇就懂了
即时通讯安全篇(九):为什么要用HTTPS?深入浅出,探密短连接的安全性
对于IM开发者来说,IM里最常用的通信技术就是Socket长连接和HTTP短连接(通常一个主流im会是这两种通信手段的结合)。从通信安全的角度来说,Socket长连接的安全性,就是基于SSL/TLS加密的TCP协议来实现的(比如微信的mmtls,见《微信新一代通信安全解决方案:基于TLS1.3的MMTLS详解》);而对于HTTP短连接的安全性,也就是HTTPS了。
JackJiang
2022/05/13
7360
即时通讯安全篇(九):为什么要用HTTPS?深入浅出,探密短连接的安全性
【网络安全】网络防护之旅 - 非对称密钥体制的解密挑战
网络安全是一门关注计算机系统和网络安全的专业学科。其首要任务是维护信息系统的核心价值,包括机密性、完整性和可用性,以对抗未经授权的访问、破坏、篡改或泄露的威胁。
SarPro
2024/02/20
2530
【网络安全】网络防护之旅 - 非对称密钥体制的解密挑战
https 是否真的安全,https攻击该如何防护,https可以被抓包吗?如何防止呢?
简单来说, https 是 http + ssl,对 http 通信内容进行加密,是HTTP的安全版,是使用TLS/SSL加密的HTTP协议
德迅云安全--陈琦琦
2023/11/26
7240
密码学专题 SSL协议
ServerHello 服务器用ServerHello信息应答客户,包括下列内容
全栈程序员站长
2022/08/27
7440
密码学专题 SSL协议
对称及非对称加密工作原理,附:密钥交换的过程
对称密钥算法非常适合于快速并安全地加密数据。但缺点是,发件人和收件人必须在交换数据之前先交换密钥。结合使用加密数据的对称密钥算法与交换机密钥的公钥算法可产生一种即快速又灵活的解决方案。
Ponnie
2022/01/13
5.1K0
对称及非对称加密工作原理,附:密钥交换的过程
HTTP与HTTPS的区别,详细介绍[通俗易懂]
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
全栈程序员站长
2022/07/01
4.8K0
HTTP与HTTPS的区别,详细介绍[通俗易懂]
HTTPS虐我千百遍,我却待她如初恋!
原文链接:https://zhuanlan.zhihu.com/p/75461564
业余草
2019/11/02
6750
HTTPS:网络安全攻坚战
我们知道,明文传输和不安全是HTTP的其中一个特点,但是随着越来越多机密的业务交易转移到线上,如银行转账、证券交易、在线支付、电商等,我们对传输的安全性有了更高的要求,为此,出现了HTTP的扩展:HTTPS,Hypertext Transfer Protocol Secure,超文本传输安全协议。
用户9282069
2021/12/13
4730
大型网站的HTTPS实践(一)---HTTPS协议和原理
1前言 百度已经于近日上线了全站HTTPS的安全搜索,默认会将HTTP请求跳转成HTTPS。本文重点介绍HTTPS协议,并简单介绍部署全站HTTPS的意义。 本文最早发表于百度运维部官方博客 2 HTTPS协议概述 HTTPS可以认为是HTTP + TLS。HTTP协议大家耳熟能详了,目前大部分WEB应用和网站都是使用HTTP协议传输的。 TLS是传输层加密协议,它的前身是SSL协议,最早由netscape公司于1995年发布,1999年经过IETF讨论和规范后,改名为TLS。如果没有特别说
小小科
2018/05/02
1.4K0
大型网站的HTTPS实践(一)---HTTPS协议和原理
HW技站法-搞定通信加密,力防数据泄露
在移动应用未做有效保护措施的情况下,如果加密 Key、通信协议、核心算法等被破解,会就会导致核心业务逻辑和重要接口暴露,*轻则影响正常使用体验,重则发生数据泄漏或财产损失*。
亿人安全
2024/08/29
1460
HW技站法-搞定通信加密,力防数据泄露
推荐阅读
相关推荐
全网最透彻HTTPS(面试常问)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档