后端 PHP 给浏览器发送一个密钥,怎样才尽可能不被发现?

2017-11-09 11:24:20 +08:00
 alwayshere

前端 js 和后端 php 公用一套加密解密系统,公用一个密钥,php 加密的字符串传到前端通过 js 进行解密,现在这个加密和解密函数的密钥想尽可能不被别人发现,该怎样实现?

  1. 用 ajax 二次请求密钥,但是 F12 一抓包就暴露了
  2. 把密钥写进一个 png 图片(类似二维码)里,通过 js 结合 canvas 来读取,但是 IE 表示无能为力
  3. 通过 cookie,input hidden 这些就更暴露了
  4. append 一个 script 标签,通过 jsonp 的形式加载,跟 ajax 一样,一抓包就暴露了
  5. websocket ? 因为 IE, 不考虑

求好心 V 友们,有没有好点的办法?

8488 次点击
所在节点    程序员
47 条回复
algery
2017-11-09 11:35:27 +08:00
传到客户端还叫密钥吗
orancho
2017-11-09 11:36:29 +08:00
HTTPS + 非对称加密
dndx
2017-11-09 11:38:21 +08:00
总是有人觉得自己能不用 TLS 达到“安全”。事实证明都是在自欺欺人。
xiaxiaocao
2017-11-09 11:39:10 +08:00
这应该是个伪需求。
先讲讲为什么要加密传给 js 吧
gdtv
2017-11-09 11:39:15 +08:00
HTTPS 就行了啊,或者:请到本公司现场获取密钥字符串
picone
2017-11-09 11:40:53 +08:00
WebSocket 也是明文

可以考虑非对称加密,如 RSA 这些算法,公钥大家都知道,私钥只有你知道,用户端用公钥加密了,只有你服务器端有私钥才能解密。

有一些例子, 比如之前分析过百度的登录页面,他们就是用 RSA 加密。公钥,指数放在 js 上面写死了,登录时候密码就加密了。
另外一个是网易云音乐 PC 端的页面,F12 发现他们 POST 的数据是加密的,然后我单步调试了下,他们是生成一个密钥,然后用 RSA 加密, 然后拿加密前的密钥用 DES 加密,然后把 DES 加密后的内容和 RSA 加密后的密钥发送到服务器。这样做是因为 RSA 运算量很大(大数运算),POST 的数据量很大( POST 之前的数据还是 JSON 编码的),如果都用 RSA 的话会很慢。
linxiaoziruo
2017-11-09 11:41:06 +08:00
秘钥的名字取的迷惑一点,让人从字面意思上看不出来这是秘钥。这是没有办法的办法。但是我还是要说,秘钥用这种方式传递,这个思路方向本身就是错的!
fe619742721
2017-11-09 11:41:08 +08:00
前端所有的内容都是暴露的。。解密过程被暴露就会被追踪到密匙啊,怎么隐蔽传输都没有用
除非你用 https 那套逻辑来进行密匙管理,但是太复杂了点
isCyan
2017-11-09 11:42:01 +08:00
非对称加密,用户生成密钥,把公钥传给服务器,服务器加密后返回,客户端密钥解密。外面再套一层 HTTPS 防止中间人
testcaoy7
2017-11-09 12:53:09 +08:00
SRP 可以,服务器不储存密码,只储存 verifier
客户端有密码,不上传服务器,只用来计算 challenge
challenge 可以通过网络,被抓包也没关系,因为不能反向推算密码

SRP 过程如果通过,服务器和客户端会各自计算出一样的密钥,用于加密通信
testcaoy7
2017-11-09 12:54:54 +08:00
tabris17
2017-11-09 12:54:55 +08:00
周末去广场裸奔,怎样才尽可能不被人发现?
tabris17
2017-11-09 12:56:16 +08:00
思路就是错的,使用私钥的计算都应该放在服务器上进行
sampeng
2017-11-09 12:57:27 +08:00
如果不上 https 的话,8 楼是正解。
我也分析并且仿造新浪的来过一波。效果不错。但无法处理回放攻击和中间人攻击。。病毒 or 脚本可以很轻松的 get 到 http 请求,然后回放登陆,https 可以避免这种情况
msg7086
2017-11-09 12:57:49 +08:00
@tabris17 黑人,在夜晚,不容易被发现。注意不要睁大眼睛,也不要张嘴。
anuan
2017-11-09 12:59:21 +08:00
希望不被谁发现呢
SummerWQM
2017-11-09 13:39:13 +08:00
很好奇这是一个 要实现什么产品的思路
cctv1005s927
2017-11-09 13:52:05 +08:00
这是一个不可能实现的问题,任何在浏览器上的东西都是公开的,你无法加密。

只有在客户端里面的东西才能加密。

我在公司有过这方面的时间,调查了很久,最终放弃了加密的方式
linescape
2017-11-09 14:05:27 +08:00
嗯 再造一个依照 https 的轮子 然后废弃直接用 https
dangyuluo
2017-11-09 14:09:26 +08:00
记得某事业单位用的一个客户端,验证用户名密码不是在服务器端,而是客户端把用户名发给服务端,服务端返回用户的密码,客户端进行比对。

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

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

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

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

© 2021 V2EX