MySQL / MariaDB генерирует безопасную последовательность - PullRequest
0 голосов
/ 15 мая 2019

Каков наилучший способ создания безопасной последовательности символов в MySQL / MariaDB?

Я хочу использовать такую ​​последовательность для процесса проверки пользователя, когда пользователь получит электронное письмо, содержащеессылка такая: www.myawesomewebsite.com/verify/<sequence> Очевидно, что эта последовательность не должна быть предсказуемой / предсказуемой, что также является причиной, по которой я не использую встроенную функцию UUID() (см. здесь ).

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Как насчет

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

Если у вас 9 триллион пользователей, есть один шанс, что 9 триллионов двух пользователей будут иметь один и тот же MD5.Но это 32 шестнадцатеричные цифры.

Встроенный UUID имеет тип 1, что означает, что он имеет компонент времени.Заметьте, сколько из двух uuids одинаково:

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

Несмотря на это, 7 из 32 символов отличаются только через 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 на разных машинах приведет к тому, что куча других цифр будет другой.

0 голосов
/ 16 мая 2019

В случае, если вы используете их (помещая последовательность проверки в URL), каждая последовательность проверки должна быть абсолютно уникальной (не должно быть никаких шансов, что одна последовательность проверки случайно проверяет другого пользователя), если только пользователь не долженповторно введите их данные по указанному им URL-адресу, и в этом случае строка подтверждения не обязательно должна быть уникальной.Для генерации уникального идентификатора вы должны объединить -

  • a уникальная часть , которая в этом случае может быть номером записи рассматриваемого пользователя, с
  • a случайная часть , которая является случайным числом, сгенерированным с помощью криптографического генератора случайных чисел (например, random_int в PHP 7 и выше).

См. также этот вопрос .

Кроме того, поскольку строка подтверждения будет отображаться в URL-адресе, который должен быть передан на сервер через HTTP, для передачи этой последовательности следует использовать HTTPS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...