已发表的技术专栏
0 grpc-go、protobuf、multus-cni 技术专栏 总入口
4 grpc、oauth2、openssl、双向认证、单向认证等专栏文章目录)
首先客户端跟服务器端握手的最终目的是
为了协商出一个对称秘钥, |
典型的秘钥协商算法有两种:
- RSA算法
- ECDH算法;
1) RSA的秘钥协商过程, |
RSA算法给予server端一个公钥和私钥,一段消息既可以用公钥加密,然后用私钥解密,也可以用私钥加密,用公钥解密。公钥是什么呢?
你可以理解成服务器从CA那得到的证书。
好,我们来看下TLS1.2的秘钥协商过程,
- client发一个client_hello,
- server端收到这个消息后,回传一个server_hello,一个证书,
- client收到证书后,用公钥(也就是证书)加密一段随机数发回给server,
- server收到后用私钥解密得到这段随机数,这段随机数就作为对称加密的秘钥了,至此握手就完成。
2) ECDH的秘钥协商过程, |
首先EC的意思是椭圆曲线,
- 这个EC提供了一个特性,在椭圆曲线上找一个点P,给定一个整数K,求解Q=KP很容易,但是给定一个点P,Q,知道Q =KP,求K却是个难题。
- 在这个背景下,给定一个大家都知道的大数G,client在每次需要和server协商秘钥时,生成一段随机数a,然后发送A=a*G给server,
- server收到这段消息(aG)后,生成一段随机数b,然后发送B=bG给client,然后server端计算(a*G)*b作为对称秘钥,
- client端收到后bG后计算a(G*b),
- 因为(aG)b = a(Gb),所以对称秘钥就是aGb啦,攻击者只能截获A=aG和B=bG,由于椭圆曲线难题,知道A和G是很难计算a和b的,也就无法计算aGb了
这块内容是我参考下面的博客内容,可能有助于大家的理解:
https://blog.csdn.net/zk3326312/article/details/80245756?utm_source=app&app_version=4.5.8
https://blog.csdn.net/mrpre/article/details/81532469?utm_source=app&app_version=4.5.8
https://www.jianshu.com/p/af8cc2db51f4/
https://blog.51cto.com/liuzhengwei521/2430427?source=dra
其实,我个人对tls加密过程,还是有很多地方不清楚的。
源代码都可以通过努力来理解,但是缺少的是对tls算法的理解。
代码只是算法的具体实现。
如果大家对tls感兴趣,可以继续研究tls算法。如果对tls算法有很好的认识的话,再看源码会很容易的。
下一篇文章
数据帧发送阶段来分析grpc框架加密的原理?