https=http+ssl。
换句话说,如果你能完整在http和tcp之间实现ssl,用http和https其实没什么区别,但是有https这样成熟的轮子,为何要浪费时间自己造新轮子,还没人家造的好。
如果你只是想当然地认为在http上用js在代码层面上实现数据加解密,就想跟https进行比较,那我还是建议你先理解一下https的概念。二者没有可比性,一个天上,一个地下,当然天上的是https。
硬伤有以下几点:
1、http加密只能加密body内容,所以肯定会暴露url、端口和参数,容易引来各类攻击。https加密是加密整个http包体,你在tcp层面上抓包,看不到与http有关的任何信息,显然更安全。
可以用Wireshark抓取百度的请求包看一下,就是下面蓝色背景里面的一坨乱码,用的对称加密,前面的数据包已经用公钥证书交换了对称加密的密钥。
2、性能问题。https完全是浏览器实现,任何原生浏览器都支持https。而http数据加密肯定需要浏览器通过http收到加密数据后,再需要用javascript来执行解密算法。我感觉这个延时不是几倍的关系,而是几个数量级的关系。
下面是一个post请求参数加密的例子。
3、https协议不仅仅是加密一个功能。除了加密,主要还有个身份认证的问题。http数据加密除了能保证第一条,部分敏感信息无法被窃听,但是信息篡改和信息劫持无法避免。比如js的加解密函数完全可以被中间人获取到。
总结一下,https吊打各种变种的http!