【TLS】ECDHE得到密钥后会发生什么
网络太差了,我先写点别的东西,敷衍一下。。。
网络好了以后,再继续迷雾通第二篇!
===============正文开始===================
扫盲地址
https://wiki.openssl.org/index.php/Elliptic_Curve_Diffie_Hellman
注意到一句话
/* Never use a derived secret directly. Typically it is passed
* through some hash function to produce a key */
也就是说,服务器收到浏览器的ClientHello以后,计算得到了premaster secret不会直接作为AES的密钥来使用!那么,我们就会思考一个问题,那么AES的密钥到底是怎么来的呢?
通过HKDF算法[https://suntus.github.io/2019/05/09/HKDF%E7%AE%97%E6%B3%95/]
具体代码,我以火狐来讲解【因为Tor浏览器的代码基于火狐~】
打开代码文件security\nss\lib\ssl\tls13con.c
浏览器收到服务器返回的ServerHello,进入处理函数 tls13_HandleServerHelloPart2
跟着调用 tls13_HandleServerKeyShare 得到 ECDHE协商出来的 premaster secret密钥
然后调用 tls13_ComputeHandshakeSecrets 得到 HKDF以后的真正密钥!
其中 tls13_HandleServerKeyShare 内部调用了 tls13_HandleKeyShare 来计算得到ss->ssl3.hs.dheSecret【ecdhe协商出来的原始密钥,后面要用到】
因为过程就是github.io里说的那样,我就不废话了!!!
回过头看server端部分:
服务器收到 浏览器的ClientHello以后,进入 tls13_HandleClientHelloPart2函数
进入 tls13_HandleClientKeyShare 函数
然后是 tls13_HandleKeyShare 得到了 原始密钥
接下来是HKDF部分
看函数 tls13_SendServerHelloSequence -> tls13_SendEncryptedServerSequence
tls13_ComputeHandshakeSecrets,走到这里,就和客户端的流程一样,所以得到了同样的密钥
网络好了以后,再继续迷雾通第二篇!
===============正文开始===================
扫盲地址
https://wiki.openssl.org/index.php/Elliptic_Curve_Diffie_Hellman
注意到一句话
/* Never use a derived secret directly. Typically it is passed
* through some hash function to produce a key */
也就是说,服务器收到浏览器的ClientHello以后,计算得到了premaster secret不会直接作为AES的密钥来使用!那么,我们就会思考一个问题,那么AES的密钥到底是怎么来的呢?
通过HKDF算法[https://suntus.github.io/2019/05/09/HKDF%E7%AE%97%E6%B3%95/]
具体代码,我以火狐来讲解【因为Tor浏览器的代码基于火狐~】
打开代码文件security\nss\lib\ssl\tls13con.c
浏览器收到服务器返回的ServerHello,进入处理函数 tls13_HandleServerHelloPart2
跟着调用 tls13_HandleServerKeyShare 得到 ECDHE协商出来的 premaster secret密钥
然后调用 tls13_ComputeHandshakeSecrets 得到 HKDF以后的真正密钥!
其中 tls13_HandleServerKeyShare 内部调用了 tls13_HandleKeyShare 来计算得到ss->ssl3.hs.dheSecret【ecdhe协商出来的原始密钥,后面要用到】
因为过程就是github.io里说的那样,我就不废话了!!!
回过头看server端部分:
服务器收到 浏览器的ClientHello以后,进入 tls13_HandleClientHelloPart2函数
进入 tls13_HandleClientKeyShare 函数
然后是 tls13_HandleKeyShare 得到了 原始密钥
接下来是HKDF部分
看函数 tls13_SendServerHelloSequence -> tls13_SendEncryptedServerSequence
tls13_ComputeHandshakeSecrets,走到这里,就和客户端的流程一样,所以得到了同样的密钥
10 个评论
我觉得迷雾通作者的设计很厉害
其中cshirt2的newTransport函数
会把ecdhe得到的密钥做 blake2b.NewMAC(32, k)
其中tinyss的 newSocket函数
会把ecdhe得到的密钥做hmac.New(sha256.New, k)
hmac,上面已经讲了,就不提了
blake2b是一种新的hash算法
其中cshirt2的newTransport函数
会把ecdhe得到的密钥做 blake2b.NewMAC(32, k)
其中tinyss的 newSocket函数
会把ecdhe得到的密钥做hmac.New(sha256.New, k)
hmac,上面已经讲了,就不提了
blake2b是一种新的hash算法
因为作者放弃了niaucchi4,我猜。。。
所以,我本地的迷雾通代码,删除了 niaucchi4 , kcp-go, kcppp, fastudp等目录
e2e相关的go文件,代码里出现e2e的函数全部删除
我最近在看的是cshirt2和tinyss两个协议
PS:作者更新真的很勤。。。我看代码速度还没有他写代码速度快。。。
我讲的代码,很可能在未来被作者重写
KCP和niaucchi4就是前车之鉴。。。
所以,我本地的迷雾通代码,删除了 niaucchi4 , kcp-go, kcppp, fastudp等目录
e2e相关的go文件,代码里出现e2e的函数全部删除
我最近在看的是cshirt2和tinyss两个协议
PS:作者更新真的很勤。。。我看代码速度还没有他写代码速度快。。。
我讲的代码,很可能在未来被作者重写
KCP和niaucchi4就是前车之鉴。。。
Tor节点选择代码 笔记
首先Tor环路 需要3个节点
入口节点【Guard】,中间节点,出口节点
分别调用以下3个函数
choose_good_entry_server
choose_good_middle_server
choose_good_exit_server
tor代码,阅读顺序,从main函数读起
tor_run_main
subsystems_init 这个是重点!!!
因为 subsystems_init_upto 调用了 r = sys->initialize();函数指针 指向 subsys_mainloop_initialize,调用了 initialize_periodic_events,
periodic_events_register,注册了
/* This is a legacy catch-all callback that runs once per second if
* we are online and active. */
CALLBACK(second_elapsed, NET_PARTICIPANT,
FL(RUN_ON_DISABLE)),
所以 调用了second_elapsed_callback
通过 circuit_predict_and_launch_new 建立环路~
首先Tor环路 需要3个节点
入口节点【Guard】,中间节点,出口节点
分别调用以下3个函数
choose_good_entry_server
choose_good_middle_server
choose_good_exit_server
tor代码,阅读顺序,从main函数读起
tor_run_main
subsystems_init 这个是重点!!!
因为 subsystems_init_upto 调用了 r = sys->initialize();函数指针 指向 subsys_mainloop_initialize,调用了 initialize_periodic_events,
periodic_events_register,注册了
/* This is a legacy catch-all callback that runs once per second if
* we are online and active. */
CALLBACK(second_elapsed, NET_PARTICIPANT,
FL(RUN_ON_DISABLE)),
所以 调用了second_elapsed_callback
通过 circuit_predict_and_launch_new 建立环路~
俺对安全的要求比较激进,不喜欢用 RSA,更喜欢用 ECC。
俺甚至不想开放网站的 80 端口,只开放 443 端口。
ECC是签名更快,并没有说安全性更高。追求安全请用RSA16384,速度慢得你怀疑人生。
从数学的角度来讲,ECC 比 RSA 更难解,因此更安全。
从数学的角度来讲,ECC 比 RSA 更难解,因此更安全。
我看到的是从传输的角度说RSA2048与ECC256可以达到同样强度的加密,但是由于公钥变小,签名也变小,节省了传输的开销。RSA4096与ECC384也可以达到同样强度的加密,公钥与签名的大小差距更大。
还有对于服务器来说,TLS的运算主要集中在签名,ECC签名更快。选ECC可以减小计算开销。
以整个帖子都是外行人看不懂的专业名词来看,这贴是不会有什么闲杂人等来光顾的了,本人一个吃瓜的路过回个评论~
楼主公开场合普及这些专业技术知识,要是被常驻在这里奸视的GFW都狗腿子程序员看到了怎么办?会不会加以利用拿来反制迷雾通
已隐藏