请教各位下 将用户的 id 在 jwt 中 算是敏感信息么?

2022-12-02 09:45:25 +08:00
 hi20151215x

程序是通过解析 jwt 中的用户 userId , 进行查询的


select * from orders where ownerid = #userId

但是看网上说 不建议将敏感信息 放入 jwt 中, 现在我有点迷惑 这个 userId 到底算不算敏感信息?

说敏感吧,毕竟有 sha256+secret key 加密。 说不敏感吧,如果换成别的 userId ,就可以查询其他用户的信息。

6959 次点击
所在节点    信息安全
61 条回复
tool2d
2022-12-02 11:47:55 +08:00
@mayday526 jwt 认证的加密方式和公钥,都是直接写到 json 头部里的。

密钥是留在客户端 JS 文件里的,但一般 Electron 这种 JS 文件不加密,随便看,随便改。
mayday526
2022-12-02 11:49:43 +08:00
@tool2d 谁告诉你 jwt 加密方式是由前端完成的?
tool2d
2022-12-02 11:53:35 +08:00
@mayday526 楼主的 SQL 语句执行是在后端吧?

那么后端来解密 JWT ,那么发送加密 JWT 的部分,肯定是在前端 /客户端了。
zjp
2022-12-02 12:09:06 +08:00
补充下#3 的吐槽
如果是根据 userld 就可以查到敏感数据,这是个横向越权的问题
wheeler
2022-12-02 12:13:23 +08:00
> 如果换成别的 userId ,就可以查询其他用户的信息。

那就是敏感。
vagusss
2022-12-02 12:14:05 +08:00
@tool2d 建议看看 jwt 的实现,本身就是后端生成的,前端只是携带。
vagusss
2022-12-02 12:15:51 +08:00
“如果换成别的 userId ,就可以查询其他用户的信息。”

除非能拿到密钥,不然怎么换?
mayday526
2022-12-02 12:16:21 +08:00
@tool2d 。。。。。前端加密,后端解密?你牛
tool2d
2022-12-02 12:17:48 +08:00
我再多啰嗦几句,

正常来说 JWT 有两种使用情况,第一种就是替代以前的 cookie user session, 后端加密后端解密,这样对于前端就是透明的存在,的确无法修改其保存内容。

另一种情况,是用于匿名身份验证,比如最近很流行的 Apple Passkeys ,就是用公钥来验证用户 ID 。

换成 JWT 流程也是一样。

第一步在前端 /客户端生成公钥和密钥。
第二步把附带公钥的 JWT 发给服务器,服务器就能自动认证用户的 ID ,因为基本上用户本地生成的公钥,是不太可能有重复的。但是因为私钥留在客户端,还是有一定被篡改的风险。
tool2d
2022-12-02 12:20:22 +08:00
@mayday526 去了解一下 acme 的 jwt 使用场景,就是典型的前端加密,后端解密。JWT 是一个完整规范,有多个使用场景,并不仅仅是 session 的替代品。
okakuyang
2022-12-02 12:25:44 +08:00
@tool2d 我麻了
tool2d
2022-12-02 12:30:36 +08:00
@okakuyang 我就觉得既然用了 JWT ,就应该用起来他的身份认证的功能,不要仅仅当黑盒字符串。

否则后端发点别的什么不好,干嘛非要给前端塞一长串的 JSON 保存起来。还不如换成 access token 用户认证,还能附带权限控制。
oott123
2022-12-02 13:08:24 +08:00
jwt 标准中没有加密,只有编码+签名,这意味着:

1. 任何人都能获知 jwt 内编码的信息
2. 除非有 secret 或者 private key ,否则没有人能轻易修改其中编码的信息,这保证了消息的完整性
coolzjy
2022-12-02 13:39:46 +08:00
简单来说,你可以把任何当前用户有访问权限的数据塞到 jwt 中,jwt 能够保证这些数据不被篡改。
mayday526
2022-12-02 13:43:00 +08:00
@tool2d 使用场景都不一样,还在东扯西扯。op 的 userid 哪里来的,数据库生成的,后端特意返回个 userid 给前端自己生成 jwt ?
你说的 jwt 黑盒字符串?黑盒? jwt 不是透明的吗?
你说换成 token 就附带权限控制?认证和授权是两个步骤,jwt 和 token 第一步都是用来认证的,你非要携带权限控制信息,jwt 就不能携带吗?
前端生成 jwt 跟裸奔有什么区别?你公司敢这么用吗?请把你公司使用这种方式的网站地址发出来
Rache1
2022-12-02 13:50:45 +08:00
@sheeta 那还不如换成传统的 Token 呢,这样子一搞,JWT 的无状态又变成有状态了。

不过可以考虑 hashids 的形式。
dqzcwxb
2022-12-02 13:55:58 +08:00
"如果不放心,专门设计一个 jwtId ,也做成全局唯一,限制其用途只用来通过 JWT 查找真正的 userId?"
"如#5 所说,redis 映射一个 jwtId => userId 的关系"
恭喜你,又重新回到了 token 体系的怀抱
wangxiaoaer
2022-12-02 13:58:20 +08:00
1 UserId 算不算敏感要看 id 的生成方式,假如你直接用身份证,那就敏感,如果是 uuid 就不敏感。

2 用户直接更换 jwt 的 userid ,请告诉我用户咋不知道私钥的情况下如何替换?难道后端不做 jwt 校验的吗?

关于楼上有提到越权的,严格讲这个不算越权,因为 jwt 就代表当前用户身份,就好比有人拦截 cookie 或者碰撞,就可以模拟别人身份操作,这个不属于越权。只不过 cookie 一般人不好拦截或碰撞,而 jwt 是公开的,假如你私钥比较简单,是会被滥用。
wangxiaoaer
2022-12-02 14:04:22 +08:00
@tool2d #29

1 JWT 有很多场景,但题主这种很显然就是用来替代身份认证的。

2 Apple Passkeys 我了解不多,但凭常识猜测这个是用在 iPhone 、Mac 等客户端上的吧,这种所谓的客户端是有硬件用来存放私钥等信息的,跟题目这种浏览器客户端压根是两个概念。
dzdh
2022-12-02 14:09:19 +08:00
优酷的视频 ID 不是说是 base64 的么

https://chenjiehua.me/python/youku-userid-and-videoid-decrypt.html

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

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

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

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

© 2021 V2EX