PHP: опции для генерации уникального пользовательского ключа - PullRequest
6 голосов
/ 26 января 2011

После нескольких дней исследований хэширования, генерации случайных чисел или уникальных ключей я немного запутался.

У меня есть еще одна вещь, которую я хочу понять, это ключ пользователя. Я хочу сохранить уникальный ключ для каждого участника / пользователя, который регистрируется на моем сайте. Так что этот ключ должен быть уникальным и не дублировать. Я думаю использовать электронную почту пользователя и хешировать ее с указанием времени или чего-то еще ...

Тогда мне интересно, какой лучший способ создать такой ключ -

Могу ли я использовать hash_hmac () , чтобы сделать это для меня?

У меня есть пара вещей, которые не понимают о hash_hmac () , хотя - как в этом примере с php.net hash_hmac('ripemd160', 'The quick brown fox jumped over the lazy dog.', 'secret');

Так в чем же «секрет» - могу ли я вместо этого поставить что-то другое, например, дату? Я предполагаю, что смогу заменить «Быстрая коричневая лиса перепрыгнула через ленивую собаку». с адресом электронной почты?

или, может быть, я могу использовать Portable PHP хэширование паролей для этого?

единственное, что он выдает ., $ и /, которые мне нужны, чтобы удалить их, иначе я получу ошибки при запросе ключа из URL.

так что я мог бы сделать это -

$hash = $phpass -> HashPassword('me@example.com'.$timedate)
$key = preg_replace("/[^a-zA-Z0-9]+/", "", $hash);

Пожалуйста, дайте мне знать, если у вас есть предложения получше.

Ответы [ 3 ]

14 голосов
/ 26 января 2011

У меня есть еще одна вещь, которую я хочу понять, это ключ пользователя.Я хочу сохранить уникальный ключ для каждого участника / пользователя, который регистрируется на моем сайте.Так что этот ключ должен быть уникальным и не дублировать.Я думаю использовать электронную почту пользователя и хэшировать ее с указанием времени или чего-то еще

  • Я бы просто позволил вашей базе данных обработать это для вас, используя autoincrement
  • Вы также можете использовать uniqid для этого: md5(uniqid(rand(), TRUE));

index.php:

for ($i=0;$i<10;$i++) {
    echo md5(uniqid(rand(), TRUE)) . "\n";
}

вывод:

php index.php 
ba0d9aad1ff0ceadf4b25f101099b91e
b5a6db5e174b426061d3d3835a6fcaea
54be6d3a03e0590917ed20b097442e3a
6e208a61eae8cfd102d4a41decf0f64e
2cafac5402815af87e8299e5e67016bd
95e839097a566471c70fe357e5a101d2
c6908532bda6f926debdda754b02f931
aac7adf999dd4dd009f208b176ea90d0
1ed7779229e57b05adc088b375582cfb
e016a684564d5cdb89201ebab1038609

Все они уникальны, и вы можете просто использовать их.Вы НЕ должны делать что-то еще?

2 голосов
/ 26 января 2011

Я рекомендую "украсть" функцию drupal_random_bytes .

0 голосов
/ 26 января 2011

О hash_hmac (): я считаю, что «секрет» - это просто строка, известная только вам и коду.Он используется для рандомизации алгоритма и делает его уникальным в зависимости от того, какой «секретный» ключ вы использовали.Просто выберите любую фразу, которую вы знаете, и поместите ее туда.Примечание: это должно быть одно и то же значение каждый раз, когда вы хешируете, если ожидаете одно и то же значение в ответ.Так что сделайте это чем-то постоянным, а не переменным, чтобы ваш хеш не возвращал другое значение каждый раз, когда вы его используете.

Но да, замените "быструю коричневую лису" тем, что вы хотите хешировать, и это должно работать.

Также вариант: использовать первичный ключ пользователя [обычно простое целое число] из базы данных, чтобы ссылаться на них.

...