【问题标题】:MySQL / MariaDB generate secure sequenceMySQL / MariaDB 生成安全序列
【发布时间】:2019-10-02 19:16:45
【问题描述】:

在 MySQL / MariaDB 上生成安全字符序列的最佳方法是什么?

我想在用户验证过程中使用这样的序列,用户将收到一封包含如下链接的电子邮件: www.myawesomewebsite.com/verify/<sequence> 显然,这个序列不应该是可猜测/可预测的,这也是我不使用内置函数UUID()(见here)的原因。

【问题讨论】:

  • 不是重复的,答案说所提出的方法在密码学上不安全。
  • 对于您正在做的事情来说,它已经足够安全了。您仅将其用于验证过程,而不是存储国家机密。

标签: mysql encryption mariadb


【解决方案1】:

在您使用它们的情况下(将验证序列放在 URL 中),每个验证序列必须是绝对唯一的(一个验证序列必须不可能意外验证不同的用户),除非用户必须在提供给他们的 URL 中重新输入他们的数据,在这种情况下,验证字符串不必是唯一的。要生成唯一标识符,您应该结合——

  • 一个唯一的部分,在这种情况下可以是相关用户的记录号,带有
  • 随机部分,它是使用加密随机数生成器生成的随机数(例如,PHP 7 及更高版本中的random_int)。

另见this question

另外,由于验证字符串会出现在必须通过 HTTP 传输到服务器的 URL 中,因此您应该使用 HTTPS 来传输该序列。

【讨论】:

    【解决方案2】:

    怎么样

    MD5(CONCAT(user_id, 'a secret salt'))
    

    如果您有 9 个 trillion 用户,则有 9 万亿个用户有 1 个机会具有相同的 MD5。但它是 32 位十六进制数字。

    内置的 UUID 是“type-1”,这意味着它有一个时间组件。注意两个 uuid 中有多少是相同的:

    mysql> SELECT UUID(), SLEEP(1), UUID()\G
    *************************** 1. row ***************************
      UUID(): b1a32a13-7f73-11e9-baa3-e4a7a03bbe24
    SLEEP(1): 0
      UUID(): b23bc508-7f73-11e9-baa3-e4a7a03bbe24
    

    即便如此,32 个字符中有 7 个字符在 1 秒后就不同了。

    这是一个毫秒的延迟:

    mysql> SELECT UUID(), SLEEP(0.001), UUID()\G
    *************************** 1. row ***************************
          UUID(): 074ca3bc-7f74-11e9-baa3-e4a7a03bbe24
    SLEEP(0.001): 0
          UUID(): 074ccdc5-7f74-11e9-baa3-e4a7a03bbe24
    

    在不同机器上运行 UUID 会产生一堆不同的其他数字。

    【讨论】:

      猜你喜欢
      • 2019-08-08
      • 2019-07-04
      • 1970-01-01
      • 2020-03-19
      • 2022-12-30
      • 2010-09-23
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多