请教一个https安全问题?
客户端通过服务端的公钥对私钥加密传给服务端的时候,服务端如何辨别不是黑客使用服务端公钥加密的自己的私钥?
问题中的“私钥”不是私钥,而是对称密钥。对称密钥其实也是泛称,准确的专业名词为“预备的主密钥”(Pre-Master Key)。所以问题就变为,客户端通过服务端的公钥对“Pre-Master Key”加密传给服务端的时候,服务端如何辨别不是黑客使用服务端公钥加密的“Pre-Master Key”?
无法知道。
你访问知乎,还是黑客访问知乎,在建立安全连接TLS完成时,知乎服务器并不知道你是你,黑客是黑客。因为在安全连接TLS建立过程,知乎服务器并没有校验你的真实身份,无论是你、我、他、黑客,都是可以访问知乎的。访问知乎的用户(客户端)都没有属于自己的数字证书,所以压根无法校验用户的真实身份。
但是,知乎服务器对你的身份很感兴趣。所以一旦安全连接建立完成,会通过http会话校验你的身份。无非手机验证码、用户名密码等方式认证。由于黑客没有你实时的手机验证码信息,所以他无法冒用你的身份。但是依然可以尝试通过用户名、密码进入你的账户,前提是你的密码特别简单。这个话题和这篇文章的相关系数小,不再展开。
上文中的“Pre-Master Key”,除了你知道,黑客知道吗?
不知道。因为“Pre-Master Key”被服务器的公钥加密了,黑客因为没有服务器的私钥,所以无法破解,自然也无法知道。
上文中的“Pre-Master Key”,除了你知道,还有谁知道?
服务器。因为服务器有服务器的私钥,自然可以解密,得到明文的Pre-Master Key。
所以,整个互联网世界,除了你、服务器知道Pre-Master Key,不会有第三个人知晓Pre-Master Key明文。根据Pre-Master Key加密的数据包在公共的互联网上传输时,没有第三方可以破解。
Pre-Master Key能直接加密用户数据吗?
不能。因为Pre-Master Key不够随机化,且其长度和加密算法(AES 128/256)长度并不相等。
怎么办?
需要将Pre-Master Key输入伪随机函数PRF,其实就是N次的hash计算。输出结果可以任意指定长度,这个输出结果就是Master Key。
Master Key能直接解密/解密用户数据吗?
依然不能。
怎样才能得到直接加密用户数据的Session Key?
需要将Master Key、Client Nonce、Server Nonce、以及协议标准字符串再运行一次PRF,得到的输出结果,按照bit位的先后次序,可以得到Read Session Key、Write Session Key、Read HMAC Key、Write HMAC Key等等。
前两者用户数据加密/解密(双向)Key,后两者用于用户数据校验的(双向)Key。
文中的Master,是指这个密钥是矿主,通信所有的Key都由矿主衍生并分发给每个矿工使用。
最后,需要强调:你和服务器之所以能够安全通信,全凭服务器的公钥,被第三方公证并签名的证书,其中有服务器的公钥明文。
文中分发Pre-Master Key的方法,已经无法满足PFS安全需求,所以在TLS1.3版本已经被完全抛弃。TLS 1.3目前只使用DH算法以及由DH衍生出DH-ECC算法来分发密钥。即使有一天,服务器的私钥泄露,人人都知道服务器的私钥,但是却无法使用该私钥解密历史数据,这就是PFS真实含义。但是使用本文的分发Pre-Master Key的方法,一旦服务器私钥泄露,历史数据就可以毫无障碍破解。
