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

Posted

技术标签:

【中文标题】我应该使用 UUID 还是常规 auto_increment 作为用户 ID?【英文标题】:Should I use UUID or regular auto_increment for my userIDs? 【发布时间】:2019-06-13 11:08:13 【问题描述】:

我正在构建一个带有 node.js 后端并结合 mysql 的应用程序。在数据库中,我有一个表“用户”,其中包含有关用户的信息。目前,那些具有带有主键的常规 ID - 所以我的用户 ID 是 0、1、2、3,...

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

userID: 173
userName: PennyWise
userLevel: user

我现在想知道是否应该将我的用户 ID 更改为 UUID。我读到这可能会减慢插入速度,但这只会在新用户注册时发生,所以我认为这不是什么大问题(它不像一个充满帖子的表格,上面有 100 个插入每天)。

我之所以要这样做,是因为如果 JWT 被泄露并且签署它的秘密也被泄露,数据可能会被破坏,只需将用户 ID 更改为,比如 122,然后是那个用户将有权访问用户 ID 122 而不是 173 的所有数据。

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

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

干杯!

【问题讨论】:

1.无论如何,您可能在某处暴露了您的用户 ID,因此无需猜测即可获得有效的用户 ID。 2. 如果您的秘密被泄露,无论哪种方式,您都会遇到一大堆问题。 3. 当你发现它被泄露时,你可以轮换你的秘密。 【参考方案1】:

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

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

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

【讨论】:

如果您使用适当的 RNG 使用库生成 v4 UUID,那么它们不应再来自一台机器的可猜测性。

以上是关于我应该使用 UUID 还是常规 auto_increment 作为用户 ID?的主要内容,如果未能解决你的问题,请参考以下文章

使用雪花id或uuid作为Mysql主键,被老板怼了一顿!

如何使用 Eloquent 在 Laravel 中设置 AUTO_INCREMENT?

mysql为什么不推荐使用uuid或者雪花id作为主键

mysql:插入数据和自动增量

使用uuid做MySQL主键,被老板,爆怼一顿!

使用uuid做MySQL主键,被老板,爆怼一顿