JWT 安全性 讨论

2017-07-17 14:53:54 +08:00
 janyw

了解了一下 JWT 协议,对于多端统一处理,服务端不用保存,还是蛮看好的。

但是也有疑问,客户端在拿到服务器签发的 JWT 后,如果客户端被拦截,Head 里面的 JWT 不修改,篡改 Body 里面的数据,服务端也会通过。

如果保证这点呢?

12168 次点击
所在节点    Java
33 条回复
Miy4mori
2017-07-17 14:56:22 +08:00
这点基本不在这种 token 类的考虑内,那是 https 的事。
hcwhan
2017-07-17 15:11:02 +08:00
jwt 里面可以加上 ip 字段
RubyJack
2017-07-17 15:18:30 +08:00
这个问题 session 也存在啊,都被中间人了就只能上 https
lshero
2017-07-17 15:49:00 +08:00
body 的数据没有签名嘛?
janyw
2017-07-17 15:54:21 +08:00
@lshero 一样的。你既然能在客户端签名,那一样可以被劫持
janyw
2017-07-17 15:54:33 +08:00
@RubyJack 也对哈
janyw
2017-07-17 15:54:40 +08:00
@Miy4mori 说的在理
lshero
2017-07-17 15:56:57 +08:00
@janyw 签名是校验数据完整性的,服务端和客户端都预留了密钥,中间人不知道密钥的话篡改数据后怎么生成对应新数据的签名啊?
janyw
2017-07-17 17:05:52 +08:00
@lshero 客户端预留密钥,你怎么保证密钥不丢
lion9527
2017-07-17 17:36:57 +08:00
所有的加密解密都在服务端完成,客户端为什么要保留秘钥?
honeycomb
2017-07-17 17:40:59 +08:00
@janyw

“你既然能在客户端签名,那一样可以被劫持”
“客户端预留密钥,你怎么保证密钥不丢”

这里的讨论应该是建立在客户端用于签名的密钥没有失窃的基础上,此时中间人不知道密钥,无法对签名所保护的内容进行篡改。

所以问题出在 @lshero 说的 HTTP body 没有签名。

至于保护客户端的密钥,则是另一件事情了。比方说你可以把 key 的存储 /使用通过硬件支持的 KeyStore 完成
wancaibida
2017-07-17 18:29:02 +08:00
jwt+jwe 啊
ChefIsAwesome
2017-07-17 18:58:15 +08:00
zouqiang
2017-07-17 19:03:53 +08:00
签名肯定得服务端,https 是必须的,+IP,前端的话可以再考虑加 fingerprint
reus
2017-07-17 19:05:05 +08:00
客户端没有密钥,客户端不能签名,所以客户端不能篡改,就是这么安全。
惟一的问题是,token 泄漏之后,你没法让它失效。
zonghua
2017-07-17 19:57:49 +08:00
@reus 所以设置更短的过期时间?
qclaogui
2017-07-17 19:58:36 +08:00
吓得我又在项目里测了好几遍,“篡改 Body 里面的数据,服务端会通过“?? LZ 可否给个列子, 几遍测下来并没有发现异常
lemayi
2017-07-17 20:52:12 +08:00
搭个车问一下。前端,不是 app。js 里面没办法存 scret_key,怎么来防止重放攻击呢?
hantsy
2017-07-17 22:12:39 +08:00
@reus JWT 可以有时效,不要太长。如果结合 OAuth2, 在前端 SPA 中可以自动用 refresh_token 去刷新。
rrfeng
2017-07-17 22:13:27 +08:00
这个不是 jwt 能解决的问题。是 https 的事。

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

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

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

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

© 2021 V2EX