如何进行加密传输

2023-04-04 10:54:43 +08:00
 cynical666
Spring Boot 项目,对于加密传输有所疑惑。目前我的实践是用 SM4 在后端加密,然后将加密数据传输给前端,前端根据密钥来解密展示。这样做虽然能够解决传输过程中的安全问题,但是我目前的实践方案涉及到密钥存储在 js 中,这样如果 js 的密钥暴漏了,其实没有解决安全风险问题。请问各位前辈是如何处理此类问题的?
3189 次点击
所在节点    Java
35 条回复
xiaohundun
2023-04-04 10:56:35 +08:00
起码把问题写清楚。。。。
cynical666
2023-04-04 11:00:44 +08:00
@xiaohundun 抱歉,刚操作失误了,现在问题已编辑。
cogear
2023-04-04 11:01:13 +08:00
HTTPS 是 Http + TLS 的组合,一般不是开发考虑的问题,后端应用正常接受 Http 请求,网关那边会做 Https 加密解密,并把 http 请求转发到后端应用。

如果是自己部署小项目,用 Nginx 做个 Https 反代就行
xiaohundun
2023-04-04 11:04:36 +08:00
@cynical666 解决传输过程中的安全问题,用 https
cynical666
2023-04-04 11:16:47 +08:00
@cogear
@xiaohundun 我这边考虑的是,有些字段不希望不加密就放到报文响应体中,这样业务就没法看到一些敏感数据,但前端又需要这些数据解密后处理业务逻辑。 我感觉,我的需求更偏向于脱敏
hhjswf
2023-04-04 11:17:31 +08:00
你是说加密报文参数?
cynical666
2023-04-04 11:20:04 +08:00
@hhjswf 是的
zbatman
2023-04-04 11:21:33 +08:00
为啥不希望不加密就放到报文响应体中呢?
yankebupt
2023-04-04 11:21:37 +08:00
斗鱼 P2P 的直播流是非对称加密的,客户端拿到了解密密钥也没用,但仅仅是为了防篡改(因为途径了第三方用户)。
上 WASM 解密可以的,就是有点流氓。
flush9f
2023-04-04 11:27:06 +08:00
如果有两侧都知道的密钥,可以 challenge 鉴定后用这个 key 做 master key 来加密,不然就只有非对称加密了
zhywang
2023-04-04 11:35:18 +08:00
先使用非对称加密算法完成密钥交换,然后再使用对称算法用密钥对业务数据进行加密,简单过程大概这样:
1. 客户端( js )内置非对称加密公钥,在握手阶段,客户端随机生成密钥的配置,将这个配置用公钥加密后发给服务端。这样即使加密后的内容被截获也无法破解,因为私钥在服务端存储。
2. 服务端用私钥解出密钥配置后,用对称加密算法和服务器端提供的密钥加密响应。
3. 客户端对响应进行解密,确认服务器端已经成功配置,后续使用对称加密进行通信。
之所以搞这么麻烦,是因为一般来说非对称加密只用来处理小数据段,加密大量数据时效率很低而且也不容易解决双向加密需求。
hhjswf
2023-04-04 11:51:15 +08:00
@zhywang #11 你这样没有解决 op 关注的客户端私钥泄露的问题吧?
leonshaw
2023-04-04 11:51:38 +08:00
前端要解密就没有完美的方法,做好代码混淆
kaedeair
2023-04-04 11:57:26 +08:00
只要人家能用 debugger 任何形式的前端加密解密就不安全
litchinn
2023-04-04 11:58:09 +08:00
WASM 好像确实可以增加被破解的难度
没有绝对的安全,这个问题首先要考虑你想要什么样的安全级别,和你的实施成本,当你对你的浏览器本身产生不信任的时候那基本啥办法也没用,只有不给前端这些数据,逻辑处理全放在后端,当你信任浏览器时那么 https 就够了,楼上给出的例如非对称加密交换一个对称加密的密钥然后通讯也就是把 https 的流程走了一遍。
如果你只是不想让人凭肉眼 f12 就看到数据,那你多转几次 base64 就能达到目的,甚至不需要加密
darkengine
2023-04-04 12:01:22 +08:00
其实解决了传输的问题就够了,展示在前端的东西你怎么藏?
Huelse
2023-04-04 12:37:07 +08:00
前端加密主要保证的是时效性,即使客户端拿到密钥了也不能一直用于揭秘获取正确数据
byte10
2023-04-04 14:35:59 +08:00
参考下 微信 小程序的做法吧,用户会话的的 session_key 就是作为对称密匙,每次加密就是用这个 session_key 进行加密的,这算是比较常见做法。 客户端是每次在 用户登录后 得到这个加密钥匙。
zpfhbyx
2023-04-04 14:37:12 +08:00
js 图片隐写加密
zhywang
2023-04-04 15:33:42 +08:00
@hhjswf 客户端不配置私钥,只有公钥,所以不存在私钥泄露问题

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

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

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

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

© 2021 V2EX