Подтвердить что ты не робот

Каков наилучший способ создания случайного хэша/строки?

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

4b9b3361

Ответ 1

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

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

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

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

Вы можете узнать больше на Библиотека PHP NONCE из FullThrottle Development

Ответ 2

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.

Ответ 5

Вы можете использовать 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)

Ответ 6

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

$length = 32;

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

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

Ответ 7

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

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

Ответ 8

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

//md5 "emulation" using sha1
ini_set('session.hash_function', 1);
ini_set('session.hash_bits_per_character', 5);

Ответ 9

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

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

Пример:

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

  • cc_rand(15) вернет нечто подобное: S4cDK0L34hRIqAS

Ура!