除了 https,有什么防止网络监听的成熟方案

2017-03-01 17:11:43 +08:00
 nilai
最近写了个小项目, 要求不用 https (丫的,就是这么奇葩), 要求保证通信的安全, 防窃听

浏览器 ----> 服务端 (这个倒好做, RSA 浏览器公钥加密, 服务端私钥解密。中间人没有私钥,就算窃听到数据也解密不出来)。


服务端 ------> 浏览器 (目前仅应付一下 就是 服务端发送数据时 AES 加密, 浏览器 AES 解密, 这样明显的缺点就是中间人分析一下网页,就知道 AES 的 KEY,然后就能解密出对应的数据了,因为不管怎么着, 数据都得在浏览器正常展示出来)

后来觉得 DH 算法应该可以, 但是实现过程略显麻烦,对 web 类的纯 HTTP 应用不是很适合,


说了这么多, 求指教。
6673 次点击
所在节点    程序员
75 条回复
RqPS6rhmP3Nyn3Tm
2017-03-01 23:45:02 +08:00
@Hardrain 所以有不同等级啊,像 ppa 这种人工核对指纹肯定不现实,所以算了算了你们自己下载吧,反正也有 https 被篡改了也是证书商背锅
你的理解是对的,这个条件就是指纹,至于公钥服务器则是任何人都可以建立的东西
O3YwA1ENkb7i35XJ
2017-03-01 23:45:22 +08:00
@Hardrain 也不知道是谁听不懂话?
Hardrain
2017-03-01 23:48:17 +08:00
@xqin 可笑 都讲明白了『篡改公钥目的是为了获取明文的通信内容』
况且楼主也没提到『中间人只有偷窥(窃听)的能力,不能做到篡改你的公钥』

死搅蛮缠
O3YwA1ENkb7i35XJ
2017-03-01 23:52:10 +08:00
@Hardrain 自己往上看看楼主在 #5 #8 #13 #18 楼回复的内容, 好吗?

楼主强调了四次 <<暂时不考虑中间人篡改内容, 只防中间人监听,解密出内容。>> 好吗?

是谁在 "死搅蛮缠" ?
MFC
2017-03-02 00:15:38 +08:00
不知 Flash 能否实现这个需求?
pubby
2017-03-02 00:15:43 +08:00
@xqin 用户最初在浏览器输入网址 http 的时候会发生什么?一开始就歪了

其实楼主也意识到了,不事先在客户端放点可靠的东西话,剩下的都是干不成的
O3YwA1ENkb7i35XJ
2017-03-02 00:20:04 +08:00
@pubby 没有, 楼主的本意应该只是探讨一下, 在非 HTTPS 以及不考虑 内容被篡改的情况下, 有什么好的方法
防止被其他人监听到传输的原始内容.

<<暂时不考虑中间人篡改内容, 只防中间人监听,解密出内容。>> 这是楼主的原话.
fengyie007
2017-03-02 00:32:20 +08:00
这个要求很奇葩,难道是为了省个证书的钱?
LeeSeoung
2017-03-02 09:18:48 +08:00
浏览器 ----> 服务端 (这个倒好做, RSA 浏览器公钥加密,
这个不是在你加密之前截获数据就行了么?
- -你要是想依靠 js , flash 完成加解密,很容易被破解,控件的话破解难度会加大,但是用户体验不好
LeeSeoung
2017-03-02 09:23:09 +08:00
@MFC flash 也可以反编译还原出加解密流程。
janxin
2017-03-02 09:23:23 +08:00
自己实现一遍 https
wizardoz
2017-03-02 09:24:37 +08:00
提出这要的要求果然很奇葩。不使用浏览器自带的 https ,反而在 JS 上实现一套不可能健全的 https 。
多出来的开发费用可以买多少年证书了啊。
nilai
2017-03-02 10:06:56 +08:00
@xqin 昨晚有事, 一早来看回复了这么多, 大家的回复我都看了, 首先这需求的确奇葩,
首先允许中间人窃听(像什么端口镜像之类等等) (小到公司内网出口,大到运营商出口等,都会分析网络流量)
其次是防止通过窃听流量还原出明文(敲黑板。。。。)
(在浏览器本身,比入注入进浏览器内存获取未加密数据不在考虑范围, 通过浏览器本身的一些插件扩散等都不在考虑范围)
(什么中间人公钥私钥替换中转也都不在此考虑范围)
xqin 应该是明白我的意思, 你的 DEMO 代码我也看了, 我目前大概也是这样做的, 不过没有用 QQTEA 算法, 还是用标准的 AES , 跟你的方案不同的是我用了 localStorageService 把本地解密的 KEY 缓存在浏览器内存中, 另一直也在准备用 ecdh 方案来实现密钥交换
O3YwA1ENkb7i35XJ
2017-03-02 10:23:34 +08:00
@nilai 感谢你再次出来证明,我对你的需求理解是正确的.

你最后说的打算采用 ECDH 的密钥交换, 其实与你用 RSA 加密 加密 key 再将加密结果传递给服务器,服务器从加密结果中还原出来加密 key 是一样的道理.

ECDH 的前提也是在客户端放 服务器是公钥, 而 RSA 也是 =,=
而且 ECDH 还需要将客户端的公钥告诉服务器类(可以想像成 RSA 加密后的结果),
然后服务器根据客户端的公钥和自己的私钥算出来一个 共享密钥(服务器解 RSA 得到加密 key).

套路都是一样的, 只是换了一种算法而已.
nilai
2017-03-02 10:27:38 +08:00
@xqin ^_^

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

https://ex.noerr.eu.org/t/344121

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

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

© 2021 V2EX