能不能有人白话文解释下 HTTPS 加密原理。

2015-12-29 10:35:36 +08:00
 yeyeye
首先每个电脑都有数字签名颁发机构信任列表这个我懂,其他的我就不懂了。

主要问题没想明白(原谅我没文化!),明明 HTTPS 的数据包,也和普通的数据包一样在互联网上传输,可以说从数据包的角度考虑,它其实还是明文的,只是在于加密方式,如何加密能让传输不可破解,而且客户端本身也没有独立的加密表(我的意思是,每个电脑都是一样的,服务器也不知道谁是谁啊,又没有特别的标示?而且也没有对应每个计算机生成一个加密表,可以互相对应。)

所以如何实现的“内容加密”,同时“双方都能解密”,又同时“传输层被截取无法解密”。

这个问题我想了很多次,每次都觉得除非服务器和客户端互相有对方的“加密表”(绝对不能在网上传输这个表内容),而且要是独立的,才能实现加密,互相可解密,传输层被截取也无法解密和伪造。
5066 次点击
所在节点    HTTP
21 条回复
maemual
2015-12-29 10:40:46 +08:00
本质上是,传输的数据是经过对称加密的,客户端和服务端都有这个密钥。但是这个密钥是在 HTTPS 的握手阶段生成的,通过非对称加密进行交换的。

发几篇最近在看的文章。

https://blog.cloudflare.com/keyless-ssl-the-nitty-gritty-technical-details/

https://cattail.me/tech/2015/11/30/how-https-works.html

https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/
zjqzxc
2015-12-29 10:40:50 +08:00
去看看什么是“非对称加密”然后就明白了
virusdefender
2015-12-29 10:42:18 +08:00
内容加密是采用对称加密的,双方在握手的时候确定了这个密钥,而这个密钥是通过非对称加密来加密的,为了性能。

浏览器为了确保服务器可信会验证服务器证书,也是非对称加密的一个应用,和加密解密的方向是相反的。
la0wei
2015-12-29 10:46:45 +08:00
"我的意思是,每个电脑都是一样的,服务器也不知道谁是谁啊"
nopy
2015-12-29 10:49:14 +08:00
不是不能解密,是解密的代价太大,可能需要几十年上百年的时间。

只要知道是安全的就行了。
wzxjohn
2015-12-29 10:54:00 +08:00
你需要的不是了解 HTTPS 的原理,而是去简单的看一下密码学,了解一下 非对称加密算法。从你的问题中可以看出你对加解密的理解还停留在 “只有双方都有密码本才能加密” 的 对称加密阶段。如果用这个思路那再白话也说不通 HTTPS 的原理的。
honeycomb
2015-12-29 11:15:45 +08:00
1 ,验证基于 pki 。 2 ,验证用户后,有密钥交换算法
SpicyCat
2015-12-29 11:26:24 +08:00
你和你朋友想聊天。
最开始你们就是直接聊天,明文传输,所有人都看得到,这是 HTTP.
然后你们觉得这样太不安全了,没有一点隐私,自然而然的,你们想给聊天内容加密。
你朋友提议:"咱们约定个密码,用这个密码加密聊天内容吧。"
你觉得不错,但是马上又发现一个问题,这个密码怎么传输?如果明文传输密码,那加密不就等于形同虚设了吗。
你朋友又提议:“你设想的是对称加密。对称加密是用一个密码或者密钥加密信息,不管谁只要知道了密钥,都能解开密文。我知道一种加密方式是非对称加密。非对称加密的密钥不是一个,而是一对,称之为公钥和私钥。公钥负责加密,私钥负责解密。用公钥加密的密文,只有对应的私钥能解。私钥在我这里妥善保存,谁都得不到,公钥我公布出去,谁都能拿到。你把我的公钥拿去,把你想的密码用公钥加密一下,然后发给我,我就知道咱们约定的密码了”
你说:“这是个好主意呀。”
于是,你先向你的朋友发出聊天邀请,你朋友回复了你,并带上了公钥,你想了个密码,然后用公钥加密,再发给朋友,你朋友用自己的私钥解密,得到了聊天用的密码,好了,现在你和你朋友安全地传输了聊天专用加密密码,你们用这个密码加密聊天信息,谁也看不到了。这叫 HTTPS

简单来说,传输内容的加密是对称加密,而对称加密用的密码是用非对称加密的形式传输的。
实际情况比这复杂,比如客户端还要验证服务器端的证书等等,但是大致流程就是这样。
yeyeye
2015-12-29 11:51:14 +08:00
已感谢以上所有……看来还要深入了解非对称加密算法才能了解……
looyao
2015-12-29 12:00:39 +08:00
我的简单理解:通过非对称 RSA 算法来交换一个对称加密 AES 或者 RC4 算法的 key ,之后就用 AES 或者 RC4 来发送加密数据了。每次建立的链接的 key 都是随机的。

http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
这篇文章写的不错。
tanyuxiang
2015-12-29 12:03:27 +08:00
两个问题
1 你先学会抓包,解析包。
2 加密简单原理。
tiancaiamao
2015-12-29 12:07:05 +08:00
可以 at 一下阮一峰,这是一个能够把技术解释到非常直白的科普作家
la0wei
2015-12-29 12:09:43 +08:00
http://chuansong.me/n/2096079
linux 中国微信号看到的,官网反而找不到了,上面链接大概是个聚合网站的。
maxsec
2015-12-29 13:31:07 +08:00
浏览器连接 www.taobao.com>
> hello, taobao, random tick is 8274
服务器:
> hello, random tick is 3122, My certificate which contains public key is in bellow:
> ----BEGIN CERTIFICATE----
> ....
> ----END CERTIFICATE----
浏览器:
> hello, random tick is rsa_encrypt(pubkey_from_cert,7461)
服务器:
> okay, we've don all ssl handshake progress, let's have a talk...
浏览器:
> aes_encryption( 'give me your /images/campaign.jpg', 8274-3122-7461);
服务器:
> aes_encryption( file_get_contents('/images/campaign.jpg'));


.....
kacong
2015-12-29 13:48:42 +08:00
学习 crypto 是了解基础的必修课。
fds
2015-12-29 14:08:16 +08:00
是有 CA 的,你电脑上操作系统预先安装的信任证书里面有 CA 的公钥,你通过公钥跟 CA 通信,获得要访问网站的公钥,然后就可以跟网站秘密通信了。这种情况下浏览器上一般都有个绿色的对勾。
另外一种是网站自己签名的,这种情况无法验证你连接的服务器确实是你想要的网站,一般浏览器会有红色的警告。
GavinHao
2015-12-29 14:53:12 +08:00
@SpicyCat 通俗,给你赞
ooTwToo
2015-12-29 14:59:13 +08:00
@SpicyCat 懂了!
rex1901
2015-12-29 15:04:20 +08:00
https://blog.cloudflare.com/keyless-ssl-the-nitty-gritty-technical-details/
非对称加密的核心在于密钥分发,即握手过程。
如果懂英文,推荐你看看这篇文章,大多数的中文文章都是在描述 RSA 握手,但是现在基本都采用 ECDH 握手,在这篇文章的下部分有分部解析,有图片,非常容易理解。
Hardrain
2016-05-23 22:55:42 +08:00
数据的传输使用对称加密(一般是 AES)然后对称加密的密钥通过 RSA 或 ECDSA(椭圆曲线)等非对称加密的公钥加密后给服务器,服务器有私钥能解密之,得到对称加密密钥,从而双方可知通信内容而传输层无法得知
P.S. 以上所述仅在有可信任的 CA 或无 CA 也无 MITM(中间人攻击)的情形下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/246853

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX