作为前端开发,或多或少都听过 HTTP 和 HTTPS 的区别,甚至在写接口地址时早已习惯加个 "s",但你是否真正了解它们之间到底有什么不同?HTTPS 的安全到底"安全"在哪?今天我们就一起来聊聊!
一、HTTP 和 HTTPS,外表一样,灵魂不一样
从名字来看,HTTPS 就是在 HTTP 的基础上加了个 "S",这个 "S" 是 Secure(安全) 的意思,也就是------加密过的 HTTP。
HTTP 是什么?
HTTP(HyperText Transfer Protocol)是超文本传输协议,它定义了客户端(通常是浏览器)和服务端如何通信。它是 明文传输 的,意味着你发送的每一个请求、表单、密码,只要被人截获,就能直接看到内容。
这就像你在大马路上大喊 "我银行卡密码是 123456!" ------ 谁路过谁都知道。
HTTPS 呢?
HTTPS 在 HTTP 基础上增加了一层加密------通过 SSL/TLS 协议 对数据进行加密。简单理解,就是给数据包套上一层"保险箱",别人即使截获了,也打不开。
二、HTTP 和 HTTPS 的区别有哪些?
特性 | HTTP | HTTPS |
---|---|---|
是否加密 | 否,明文传输 | 是,基于 SSL/TLS 加密 |
默认端口 | 80 | 443 |
安全性 | 低,易被劫持、篡改 | 高,防劫持、防篡改、防监听 |
证书支持 | 不需要证书 | 需要 SSL 证书 |
性能消耗 | 相对低 | 稍高(但现在可忽略) |
你可能会说,HTTPS 要多消耗一点性能啊,那我是不是可以只在登录、支付这些页面用 HTTPS?
这个做法在十年前可能合理,但现在几乎所有网站(包括博客、静态站)都默认全站 HTTPS,主要是因为:
- 浏览器已经开始标记 HTTP 网站为"不安全";
- Google 搜索权重也会优先考虑 HTTPS;
- 性能开销已经很小了,尤其在 HTTP/2 推出之后反而更快。
三、HTTPS 的加密方式到底是什么?
很多人听到加密就头大,说什么对称加密、非对称加密一堆术语。其实不用太复杂,我们可以先理解"交换钥匙"的过程:
1. 对称加密:快,但密钥不能丢
对称加密就像两个人用同一把钥匙开门,比如 AES、DES。加密快,但问题是:密钥怎么传给对方?
如果我用快递寄给你密钥,一路上被人偷走,那就白加密了。
2. 非对称加密:安全,但效率低
这时就需要非对称加密,比如 RSA。有一把"公钥"和一把"私钥"。
- 公钥人人可见,用它加密;
- 私钥自己保存,用它解密。
比如你用我网站的公钥加密一段内容,只有我能解开。这样密钥就不用暴露在路上了,安全。
但非对称加密效率很低,尤其是对大文件。所以我们要 两者结合使用。
3. 混合加密:TLS 的真面目
阶段1:握手阶段(用非对称加密)
- 目的:安全地协商出一个对称加密的密钥
- 过程:
-
- 客户端用服务器的公钥加密一个随机数
- 服务器用私钥解密得到这个随机数
- 双方基于这个随机数生成相同的对称密钥
阶段2:数据传输阶段(用对称加密)
- 目的:高效地传输实际数据
- 过程:所有网页内容、表单数据等都用刚才协商的对称密钥加密
形象的比喻
想象你要给朋友寄一个装满钱的箱子:
- 握手阶段:你们先用"挂号信"的方式(非对称加密)安全地交换箱子的密码
- 数据传输阶段:然后用这个密码锁住箱子(对称加密)快速寄送
具体的技术流程
arduino
客户端 → 服务器: "我支持这些加密算法"
服务器 → 客户端: "我选择AES-256,这是我的证书和公钥"
客户端 → 服务器: "好的,我生成了一个随机数,用你的公钥加密发给你"
服务器 → 客户端: "收到,我们现在都有了相同的密钥"
双方: "开始用AES-256加密传输数据"
为什么这样设计?
- 安全性:非对称加密解决了密钥分发问题
- 效率:对称加密保证了数据传输速度
- 实用性:结合了两者的优点,避免了各自的缺点
这就是为什么HTTPS既安全又不会太慢的原因。它在建立连接时花一点时间用非对称加密"握手",然后在传输数据时用高效的对称加密。
四、那 HTTPS 就绝对安全吗?
不能说绝对,但比明文 HTTP 强太多太多。
HTTPS 可以防止:
- 被中间人劫持(比如运营商注入广告);
- 被监听内容(比如你密码、token 被抓包);
- 被篡改数据(比如返回的 JSON 被改动);
但要注意几点:
- 如果你网站证书没配好,浏览器照样报红;
- 如果你把密码打印在控制台,再加密也没用;
- 如果你的 JS 被 CDN 替换,HTTPS 也救不了你。
五、总结
- HTTP 是明文,HTTPS 是加密的;
- HTTPS 是通过 SSL/TLS 协议实现加密的,混合使用非对称加密和对称加密;
- 建议所有网站都默认启用 HTTPS,不要等浏览器"红叉"才改。