我应该为用户ID使用UUID还是常规的auto_increment?

时间:2019-01-19 11:28:27

标签: mysql json security jwt uuid

我正在构建一个结合了MySQL的node.js后端的应用程序。在数据库中,我有一个“用户”表,其中包含有关用户的信息。当前,这些用户具有带有主键的常规ID,因此我的用户ID为0、1、2、3,...

我现在面临的问题是我使用JSON Web令牌对用户进行身份验证并将userID存储在有效负载中。例如,我的有效负载如下:

userID: 173
userName: PennyWise
userLevel: user

我现在想知道是否应该将用户ID更改为UUID。我读到这可能会降低插入速度,但这只会在新用户注册后才会发生,因此我认为这不应该是一个大问题(它不像是一张桌子上满是100个插入内容的帖子每天)。

我要这样做的原因是,如果JWT受到破坏,并且签名它的秘密也受到破坏,则数据可能会损坏,只需将userID更改为122,然后将该用户更改将可以访问用户ID 122而不是173的所有数据。

我并不是说会发生这种情况-我使用的令牌有效期为21天(移动应用程序),并检查发布日期是否早于3个小时以进行刷新(使用刷新令牌),然后针对该令牌进行检查数据库以查看其是否仍然相同-更改密码时需要自动更改此刷新令牌,而原始密码需要该密码。但是,如果ID读起来不是那么“明显”,我想我会更有信心。

对此有任何想法或建议吗?坚持使用常规ID(0、1、2、3)还是针对此特定情况更改为UUID并将其存储在JWT中?

干杯!

1 个答案:

答案 0 :(得分:0)

为了性能起见,请将用户ID保留为自动递增的整数。这对性能有很大帮助。

另一方面,在一台计算机上生成的UUID不足以猜测是否具有安全性。如果您需要为每个用户使用密码安全(难以猜测)的秘密ID,请生成一个并将其放在每个用户的行中。只是不要将其用作主键。大多数宿主语言都有一个安全的随机数生成器。 MySQL没有。

第三,小心保护您的JWT机密并经常轮换它们。难以猜测和短暂是一个很好的组合。多亏了加里·拉尔森(Gary Larson),除非您在一家大公司里工作,否则您最好的网络安全方法是“比下一个更安全”。

By Gary Larson