这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战
书接上回,在使用ECDHE进行加密协商的同时,服务器需要证明自己的身份,使用签名算法对密钥交换消息进行签名,常使用的签名算法是RSA和ECDSA。
ECDSA & RSA签名算法
在密钥协商过程中,服务器必须使用约定的签名算法(ECDSA或RSA)对协商信息进行签名。这里需要注意几点:
-
服务器的签名算法与CA证书的签名算法完全没有关系,是相互独立的,虽然他们都是由服务器发送。CA证书的签名算法是由颁发证书的机构决定的,服务器的签名算法是在密钥协商的时候,由服务器选择的。
-
服务器的公钥在TLS certificate消息中的第一份证书中的subject public key info字段中,这个公钥是用来验证服务器发送加密参数时的签名用的。
- 当服务器选择ECDSA签名算法时,它的椭圆曲线参数与加密算法ECDHE是一致的,最底部的signature就是服务器用私钥加密的签名:
我们具体看一下RSA算法
-
RSA算法的加密基础是"大整数做因数分解是一件非常困难的事情”。目前,除了暴力破解,还没有发现别的有效方法。
-
所以RSA的密码强度与它密钥的长度正相关,目前公认比较安全的长度是2048bit。这样导致RSA的加密和解密效率非常低下,达到同样的安全等级,AES算法速度是RSA的20倍以上。
-
RSA算法既可以用来加密,也可以用来签名,在签名时,需要先对源数据进行hash运算,获得固定长度的hash值后,再对hash值进行私钥签名。
-
RSA签名算法非常简单:元数据hash^d%N=签名C;验证过程:签名C^e%N=元数据hash,其中签名算法参数(d,N)为私钥,服务器独有;验证公钥(e,N)明码传输给客户端;
-
那么RSA公钥和私钥如何而来?
- 服务器和客户端选取一致的两个大质数p和q, 计算p*q=N,N的长度即为密钥长度(建议2048bit)
- 再计算欧拉函数φ(N) = (p-1)(q-1)用来确定e的取值范围,e是一个随机数,取值范围在1与φ(N)之间,且必须与φ(N)互质的正整数。
- 最后计算d,d是e对于φ(N)的模反元素,即d*e%φ(N)=1,通过扩展欧几里得算法可以求得模反元素d。
ECDSA算法
Elliptic Curve Digital Signature Algorithm, 椭圆曲线数字签名算法,这是一个专门为数字签名设计的算法
-
椭圆曲线算法的原理是,在一条满足y2 = x3 + ax + b的曲线上,选取一个原点G,并随机生成私钥d,用点G*d=A,A也是该曲线上的点,将这个A作为公钥。
-
ECDSA签名时,先对源数据取hash,再对该hash值进行签名运算Signature=ECDSA(Private key, hash(source data)). 这个签名本身包含2个数字(R,S). 在客户端进行验证时,将公钥和S带入计算,如果能够得到R的话,就说明签名有效。ECDSA的具体算法可以参考这篇文章:一文读懂ECDSA算法如何保护数据
-
将椭圆曲线参数应用于DSA算法,大幅缩减了密钥长度,根据资料ECDSA 192bit的加密强度与RSA 1024bit强度相当,同时带来了计算量的减少与传输效率的增强。
MasterKey 和 Session Key
首先纠正一点,很多文章把TLS1.2密钥生成写到master key就结束了,这是错误的。
- TLS1.2最终会话使用的密钥不是master key,而是session key,session key从master key中产生。下图截取自IETR RFC 5246 section 6.3:
- 最终用于加密会话的密钥是server_write_key, client_write_key,以及负责完整性保护的server_write_MAC_key, client_write_MAC_key. 这里统称为session key.
- 首先关于master key的生成,由3部分组成:client random + server random + pre-master key, 每次握手时都会协商这3个值,所以新建会话的master key也不一样
- PRF(pseudo-random function)伪随机函数,截取48byte。最终的master key长度固定是48byte. 一旦master secret生成,pre master secret也就应该删除了,为了防止被破解.
- 生成session key:将master key扩张为一个密钥字节序列,再通过PRF运算将其分割为client write MAC key + server write MAC key + client write encryption key + server write encryption key,作为AES块加密的密钥素材(key material)
- AES加密算法Advanced Encryption Standard,属于对称块加密算法(symmetric block cipher),固定块大小是128bit, 支持128bit-10轮/192bit-12轮/256bit-14轮的密钥长度, 每轮使用轮密钥加(Add Round Key),字节替换,行移位和列混淆,对源数据进行加密。解密就是以上步骤的逆变换;这里面使用到的key block就是上一步从session key计算中获取的。
- 关于AES算法的具体详情可以参考这篇文章:《密码学基础:AES加密算法》
-
采用AES做最终加密是因为对称加密算法的效率和速度都远高于非对称加密,所以用在应用数据传输上是最合适的;
-
客户端先通过MAC secret保护源数据的完整性,再对这个数据包使用client write encryption key进行加密。在服务端收到密文之后,先使用Client write encryption key进行解密,再使用各自的write MAC key验证数据的完整性。
最后,附一张TLS1.2的密钥生成示意图
以上就是TLS1.2在加密协商中使用到的算法知识,我会在下一篇,通过实际TLS1.2消息报文详细讲解整个握手流程
感谢阅读,如有不准确和错误之处请留言指正,我会立即修正,感谢!
总结不易,请勿私自转载,否则别怪老大爷不客气
欢迎喜欢技术的小伙伴和我交流,微信1296386616
参考资料:
浅析RSA算法 叨陪鲤 zhuanlan.zhihu.com/p/375258787
COMPARISON AND EVALUATION OF DIGITAL SIGNATURE SCHEMES EMPLOYED IN NDN NETWORK by Al Imem Ali arxiv.org/ftp/arxiv/p…
一文读懂ECDSA算法如何保护数据 Datacruiser zhuanlan.zhihu.com/p/97953640
TLS1.2 PreMasterSecret And MasterSecret by 老青菜 laoqingcai.com/tls1.2-prem…
The Transport Layer Security (TLS) Protocol Version 1.2 datatracker.ietf.org/doc/html/rf…
密码学基础:AES加密算法 QiuJYu bbs.pediy.com/thread-2538…
漫画:AES 算法的底层原理 juejin.cn/post/684490…
《HTTPS 温故知新(五) —— TLS 中的密钥计算》 Halfrost halfrost.com/https-key-c…