Каков наилучший способ создать случайный хэш / строку? - PullRequest
43 голосов
/ 19 февраля 2010

Каков наилучший способ генерации хеша для хранения сессии? Я ищу легкое портативное решение.

Ответы [ 9 ]

64 голосов
/ 12 марта 2014
bin2hex(mcrypt_create_iv(22, MCRYPT_DEV_URANDOM));
  1. mcrypt_create_iv даст вам случайную последовательность байтов.
  2. bin2hex преобразует его в текст ASCII

Пример вывода:

d2c63a605ae27c13e43e26fe2c97a36c4556846dd3ef

Имейте в виду, что «лучший» - это относительный термин. У вас есть компромисс между безопасностью, уникальностью и скоростью. Приведенный выше пример подходит для 99% случаев, однако, если вы имеете дело с особо конфиденциальными данными, вы можете прочитать о разнице между MCRYPT_DEV_URANDOM и MCRYPT_DEV_RANDOM .

Наконец, существует RandomLib"для генерации случайных чисел и строк различной силы".

Обратите внимание, что до сих пор я предполагал, что вы хотите сгенерировать случайную строку , которая не совпадает с , получая хеш из значения. Для последнего обратитесь к password_hash .

17 голосов
/ 24 сентября 2016

random_bytes() доступно с версии PHP 7.0 (или используйте этот polyfill для 5.2-5.6 ):

$hash = bin2hex(random_bytes(16));
echo serialize($hash);

Выход:

s: 32: "c8b2ca837488ff779753f374545b603c";

10 голосов
/ 19 февраля 2010

Вы можете использовать встроенные в PHP функции хеширования, sha1 и md5. Выберите один, а не оба.

Можно подумать, что использование обоих, sha1(md5($pass)) было бы решением. Использование обоих не делает ваш пароль более безопасным, вызывает избыточные данные и не имеет большого смысла.

Взгляните на Консорциум PHP Security: хеширование паролей они дают хорошую статью со слабыми сторонами и улучшают безопасность с помощью хеширования.

Nonce означает " n количество использованных камер один раз ". Они используются в запросах для предотвращения несанкционированного доступа, они отправляют секретный ключ и проверяют ключ каждый раз, когда используется ваш код.

Подробнее об этом можно узнать на PHP NONCE Library от FullThrottle Development

9 голосов
/ 19 февраля 2010

Может быть uniqid () - это то, что вам нужно?

uniqid - создать уникальный идентификатор

7 голосов
/ 22 августа 2016

Вы можете использовать openssl_random_pseudo_bytes начиная с php 5.3.0 для генерации псевдослучайной строки байтов. Вы можете использовать эту функцию и каким-то образом преобразовать ее в строку, используя один из следующих методов:

$bytes = openssl_random_pseudo_bytes(32);
$hash = base64_encode($bytes);

или

$bytes = openssl_random_pseudo_bytes(32);
$hash = bin2hex($bytes);

Первый генерирует самую короткую строку с цифрами, строчными, прописными и некоторыми специальными символами (=, +, /). Второй вариант будет генерировать шестнадцатеричные числа (0-9, a-f)

1 голос
/ 10 декабря 2017

Используйте random_bytes(), если доступно!

$length = 32;

if (function_exists("random_bytes")) {
    $bytes = random_bytes(ceil($lenght / 2));
    $token = substr(bin2hex($bytes), 0, $lenght)
}

Проверьте это на php.net

0 голосов
/ 23 декабря 2015

У разных людей будут разные best способы. Но это мой путь:

  1. Скачать этот rand-hash.php файл: http://bit.ly/random-string-generator
  2. include() это в сценарии php, с которым вы работаете. Затем просто позвоните cc_rand() функция. По умолчанию возвращается 6 символов случайная строка, которая может включать a-z, A-Z, и 0-9. Вы можете пройти length, чтобы указать, сколько символов cc_rand() должно возвращаться.

Пример:

  1. cc_rand() вернет что-то вроде: 4M8iro

  2. cc_rand(15) вернет что-то похожее на это: S4cDK0L34hRIqAS

Ура!

0 голосов
/ 19 февраля 2010

Обычно я не управляю идентификаторами сеансов вручную. Я видел что-то в этом духе, рекомендованное для того, чтобы что-то смешивать немного раньше, я никогда не использовал себя, поэтому не могу засвидетельствовать, что это лучше или хуже, чем по умолчанию (обратите внимание, это для использования с автогеном, а не с ручным управлением).

//md5 "emulation" using sha1
ini_set('session.hash_function', 1);
ini_set('session.hash_bits_per_character', 5);
0 голосов
/ 19 февраля 2010

Я лично использую apache mod_unique_id для генерации случайного уникального числа для хранения моих сессий. Это действительно удобно (если вы используете Apache).

Для nonce посмотрите здесь http://en.wikipedia.org/wiki/Cryptographic_nonce есть даже ссылка на библиотеку PHP.

...