Каков наилучший способ генерации хэша для хранения сеанса? Я ищу легкое портативное решение.
Каков наилучший способ создания случайного хэша/строки?
Ответ 1
Вы можете использовать встроенные функции хеширования PHP, sha1
и md5
. Выберите один, не оба.
Можно подумать, что использование обоих, sha1(md5($pass))
было бы решением. Использование обоих не делает ваш пароль более безопасным, его причины избыточные данные и не имеет большого смысла.
Взгляните на Консорциум безопасности PHP: перехват паролей, они дают хорошую статью с недостатками и улучшают безопасность с помощью хеширования.
Nonce означает " n, который используется один раз". Они используются при запросах на предотвращение несанкционированного доступа, они отправляют секретный ключ и проверяют ключ каждый раз, когда ваш код используется.
Вы можете узнать больше на Библиотека PHP NONCE из FullThrottle Development
Ответ 2
bin2hex(mcrypt_create_iv(22, MCRYPT_DEV_URANDOM));
- mcrypt_create_iv даст вам случайную последовательность байтов.
- bin2hex преобразует его в текст ASCII
Пример вывода:
d2c63a605ae27c13e43e26fe2c97a36c4556846dd3ef
Имейте в виду, что "лучший" - это относительный термин. У вас есть компромисс между безопасностью, уникальностью и скоростью. Приведенный выше пример подходит для 99% случаев, хотя, если вы имеете дело с особо конфиденциальными данными, вы можете прочитать о разнице между MCRYPT_DEV_URANDOM и MCRYPT_DEV_RANDOM.
Наконец, есть RandomLib "для генерации случайных чисел и строк различной силы".
Обратите внимание, что до сих пор я предполагал, что вы хотите сгенерировать случайную строку, которая отличается от получения хэша из значения. Для последнего, обратитесь к password_hash.
Ответ 3
random_bytes()
доступно с версии PHP 7.0 (или используйте этот полифилл для версий от 5.2 до 5.6):
$hash = bin2hex(random_bytes(16));
echo serialize($hash);
Выход:
s:32:"c8b2ca837488ff779753f374545b603c";
Ответ 4
Возможно, uniqid() - это то, что вам нужно?
Ответ 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)
}
Ответ 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
Ура!