Skip to content

请教一下REALITY是如何验证服务器身份的 #3947

Answered by Ficoto
caikun233 asked this question in Q&A
Discussion options

You must be logged in to vote

这个要从x25519算法开始说起

ECDH 的过程如下:
Alice 生成自己的私钥 a,并且计算公钥 A=a⋅G
Bob 生成自己的私钥 b,并且计算公钥 B=b⋅G
Alice 和 Bob 将自己的公钥通过不安全信道发送给对方
Alice 计算 K=a⋅B=a⋅(b⋅G)=ab⋅G
Bob 计算 K=b⋅A=b⋅(a⋅G)=ab⋅G
Alice 和 Bob 可以得到一个相同的结果作为接下来对称加密的密钥,但是攻击者仅通过偷听到的
A 和 B很难计算出 a,b 的值,也很难得出 K 的结果。

这样我们就可以通过交换公钥来进行验证,首先client 生成一对新的x25519的私钥跟公钥,通过client hello的keyShares传输生成的公钥,将生成的私钥跟client配置的公钥进行ECDH计算得出一个authkey,将这个authkey通过sessionid进行传输,服务端拿到client新生成的公钥和自己配置的私钥进行计算得出的authkey与sessionid内的authkey进行对比,一致的就是可信任的,服务端在启动时会随机生成一个x25519的私钥以及这个私钥生成的证书,这时候服务端将启动时的证书作为握手的证书下发下去,这样就可以完成后续的握手交换密钥了

Replies: 1 comment 5 replies

Comment options

You must be logged in to vote
5 replies
@caikun233
Comment options

@Ficoto
Comment options

@caikun233
Comment options

@Ficoto
Comment options

@caikun233
Comment options

Answer selected by caikun233
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Q&A
Labels
None yet
2 participants