3

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

 1 year ago
source link: https://www.v2ex.com/t/899520
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  问与答

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

  hi20151215x · 8 小时 50 分钟前 · 2437 次点击

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


select * from orders where ownerid = #userId

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

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

48 条回复    2022-12-02 18:00:57 +08:00
leonme

leonme      8 小时 42 分钟前 via iPhone

userId 很多网站直接露出,你说算敏感信息吗?
geelaw

geelaw      8 小时 38 分钟前 via iPhone   ❤️ 5

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

我不知道从何吐槽起了。
dddd1919

dddd1919      8 小时 36 分钟前

如果 id 作为数据表主键或功能外键之类的内部功能字段,建议不要放入 jwt ,除非信息需要展示给用户,否则完全没必要放入
gbw1992

gbw1992      8 小时 35 分钟前

一般情况下都这么干
我个人觉得 userid 也是拿用户名和和密码换的,不是用户信息不算是敏感。
orangie

orangie      8 小时 32 分钟前   ❤️ 2

如果不放心,专门设计一个 jwtId ,也做成全局唯一,限制其用途只用来通过 JWT 查找真正的 userId?
sheeta

sheeta      8 小时 31 分钟前

如#5 所说,redis 映射一个 jwtId => userId 的关系
tool2d

tool2d      8 小时 24 分钟前

肯定不能用 userId 啊,你看看大厂的用户 oauth API ,全部都是转换成 access token 令牌访问的。
swulling

swulling      8 小时 22 分钟前 via iPhone   ❤️ 2

userid 不敏感,但是你们有接口可以允许通过 userid 查询其他人的信息,这个是错误的。没权限控制么?
hoopan

hoopan      8 小时 6 分钟前

不是敏感,userid 没啥特殊含义
Jooooooooo

Jooooooooo      8 小时 1 分钟前

"如果换成别的 userId ,就可以查询其他用户的信息"

这是典型的越权. 你再多搜搜
vopin

vopin      8 小时 0 分钟前

> 如果换成别的 userId ,就可以查询其他用户的信息
不是有签名吗?内容更换了校验是不成功的呀。
mayday526

mayday526      7 小时 58 分钟前

@Jooooooooo 越什么权,用户手动修改 jwt 中的 userid ,这个 jwt 就不会认证通过,除非用户知道该系统 jwt 的加密方式
radiocontroller

radiocontroller      7 小时 57 分钟前

如果换成别的 userId ,就可以查询其他用户的信息。

前提是加密加签要正确,才能生成正确的 jwt token ,那谁又能拿到你的私钥去做这个事呢
fuchish112

fuchish112      7 小时 57 分钟前

看业务咯,大多数业务是不敏感的
mayday526

mayday526      7 小时 55 分钟前

userid 都要隐藏起来?那你们还要用 jwt 干嘛,为什么不用普通的 redis+自定义 token 的方式,jwt 用来认证一堆鬼问题:自动续期 jwt 如何解决,强制剔除或者使某个 jwt 失效又该如何解决
Jooooooooo

Jooooooooo      7 小时 53 分钟前

@mayday526 如你所说, 那就并非 "换成别的 userId ,就可以查询其他用户的信息".

我只是按照 op 所说描述.
diegozhu

diegozhu      7 小时 49 分钟前

@geelaw 请教下,有哪些槽点?
aitaii

aitaii      7 小时 31 分钟前

jwt 不加密的?
momocraft

momocraft      7 小时 30 分钟前

lawler

lawler      7 小时 6 分钟前

@diegozhu #17 这句话和“他知道我的电话号码,就可以接听我的来电”一样卧槽。

更值得发掘的槽点是,11 楼之前的狗屁不通。。(哭笑
tool2d

tool2d      6 小时 47 分钟前

@mayday526 jwt 认证的加密方式和公钥,都是直接写到 json 头部里的。

密钥是留在客户端 JS 文件里的,但一般 Electron 这种 JS 文件不加密,随便看,随便改。
mayday526

mayday526      6 小时 45 分钟前

@tool2d 谁告诉你 jwt 加密方式是由前端完成的?
tool2d

tool2d      6 小时 41 分钟前

@mayday526 楼主的 SQL 语句执行是在后端吧?

那么后端来解密 JWT ,那么发送加密 JWT 的部分,肯定是在前端 /客户端了。
zjp

zjp      6 小时 26 分钟前 via Android

补充下#3 的吐槽
如果是根据 userld 就可以查到敏感数据,这是个横向越权的问题
wheeler

wheeler      6 小时 22 分钟前 via iPhone

> 如果换成别的 userId ,就可以查询其他用户的信息。

那就是敏感。
vagusss

vagusss      6 小时 21 分钟前 via iPhone

@tool2d 建议看看 jwt 的实现,本身就是后端生成的,前端只是携带。
vagusss

vagusss      6 小时 19 分钟前 via iPhone

“如果换成别的 userId ,就可以查询其他用户的信息。”

除非能拿到密钥,不然怎么换?
mayday526

mayday526      6 小时 19 分钟前

@tool2d 。。。。。前端加密,后端解密?你牛
tool2d

tool2d      6 小时 17 分钟前

我再多啰嗦几句,

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

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

换成 JWT 流程也是一样。

第一步在前端 /客户端生成公钥和密钥。
第二步把附带公钥的 JWT 发给服务器,服务器就能自动认证用户的 ID ,因为基本上用户本地生成的公钥,是不太可能有重复的。但是因为私钥留在客户端,还是有一定被篡改的风险。
tool2d

tool2d      6 小时 15 分钟前

@mayday526 去了解一下 acme 的 jwt 使用场景,就是典型的前端加密,后端解密。JWT 是一个完整规范,有多个使用场景,并不仅仅是 session 的替代品。
tool2d

tool2d      6 小时 4 分钟前

@okakuyang 我就觉得既然用了 JWT ,就应该用起来他的身份认证的功能,不要仅仅当黑盒字符串。

否则后端发点别的什么不好,干嘛非要给前端塞一长串的 JSON 保存起来。还不如换成 access token 用户认证,还能附带权限控制。
oott123

oott123      5 小时 27 分钟前

jwt 标准中没有加密,只有编码+签名,这意味着:

1. 任何人都能获知 jwt 内编码的信息
2. 除非有 secret 或者 private key ,否则没有人能轻易修改其中编码的信息,这保证了消息的完整性
coolzjy

coolzjy      4 小时 55 分钟前

简单来说,你可以把任何当前用户有访问权限的数据塞到 jwt 中,jwt 能够保证这些数据不被篡改。
mayday526

mayday526      4 小时 52 分钟前

@tool2d 使用场景都不一样,还在东扯西扯。op 的 userid 哪里来的,数据库生成的,后端特意返回个 userid 给前端自己生成 jwt ?
你说的 jwt 黑盒字符串?黑盒? jwt 不是透明的吗?
你说换成 token 就附带权限控制?认证和授权是两个步骤,jwt 和 token 第一步都是用来认证的,你非要携带权限控制信息,jwt 就不能携带吗?
前端生成 jwt 跟裸奔有什么区别?你公司敢这么用吗?请把你公司使用这种方式的网站地址发出来
Rache1

Rache1      4 小时 44 分钟前

@sheeta 那还不如换成传统的 Token 呢,这样子一搞,JWT 的无状态又变成有状态了。

不过可以考虑 hashids 的形式。
dqzcwxb

dqzcwxb      4 小时 39 分钟前

"如果不放心,专门设计一个 jwtId ,也做成全局唯一,限制其用途只用来通过 JWT 查找真正的 userId?"
"如#5 所说,redis 映射一个 jwtId => userId 的关系"
恭喜你,又重新回到了 token 体系的怀抱
wangxiaoaer

wangxiaoaer      4 小时 37 分钟前

1 UserId 算不算敏感要看 id 的生成方式,假如你直接用身份证,那就敏感,如果是 uuid 就不敏感。

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

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

wangxiaoaer      4 小时 31 分钟前

@tool2d #29

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

2 Apple Passkeys 我了解不多,但凭常识猜测这个是用在 iPhone 、Mac 等客户端上的吧,这种所谓的客户端是有硬件用来存放私钥等信息的,跟题目这种浏览器客户端压根是两个概念。
watzds

watzds      4 小时 23 分钟前

你是不懂 jwt 的,也不懂加密和认证
lanlanye

lanlanye      4 小时 16 分钟前

@lanlanye
发完意识到这篇文章没提 JWT ,补充一下:
1. JWT 的意义是保证数据完整性,只能存放公开的信息,user_id 这种东西看场景,大部分时候应该是可以公开的
2. JWT 是无状态的,需要设置较短的有效期,签发后无法在有效期内收回
3. 尽量不要通过在服务端保存签出的 JWT 这种方式来控制其有效性,因为这会使 JWT 失去它无状态的特点,不如直接用回 cookie-session 那一套
tool2d

tool2d      3 小时 52 分钟前

@mayday526 你既然说了使用场景不一样,说明还是能看懂我说的。

https://en.wikipedia.org/wiki/JSON_Web_Token ,里面有一段 use 案例描述,写了有传统后端验证外,还有客户端直接发起 JWT 身份验证两种方式。

作为后者,很适合匿名账户纯客户端直接认证。私钥又不需要在网络传输,只有用户自己能看见,本机不泄漏,就很安全。
superliy

superliy      3 小时 45 分钟前

sha256+secret key 这里加密 不是因为敏感而是用于数据校验,不被串改。。你理解方向歪了。。。
JamChiu

JamChiu      3 小时 13 分钟前

jwt 存放的内容本来就敏感,但是加密了,你解密不了也没用,所以有需要就放,没需要就不放~
leonshaw

leonshaw      2 小时 20 分钟前

敏感不敏感是保密性,能不能篡改是完整性,注意区分。
通常所说的 JWT 只保证完整性,关于加密了解下 JWE.
JasperYanky

JasperYanky      34 分钟前

说个不太显眼的用途,如果 userid 是显性连续的,投资机构会用这个估算产品真实的用户规模

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK