MySQL / MariaDB生成安全序列

时间:2019-05-15 15:22:30

标签: mysql encryption mariadb

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

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

2 个答案:

答案 0 :(得分:0)

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

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

另请参阅this question

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

答案 1 :(得分:0)

怎么样

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

如果您有9个万亿用户,则有9万亿个两个用户拥有相同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

即使如此,仅1秒钟后,32个字符中就有7个是不同的。

这是毫秒级的延迟:

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会产生许多其他数字。