Каков наилучший способ генерации хэша для хранения сеанса? Я ищу легкое портативное решение.
Вы можете использовать встроенные функции хеширования PHP, sha1
и md5
. Выберите один, а не оба.
Можно подумать, что использование обоих, sha1(md5($pass))
будет решением. Использование обоих не делает ваш пароль более безопасным, его причины избыточные данные и не имеет большого смысла.
Взгляните на PHP Security Consortium: Хеширование паролей дает хорошую статью с недостатками и улучшает безопасность с хешированием.
Nonce означает, что « n umbers используется один раз ». Они используются при запросах на предотвращение несанкционированного доступа, они отправляют секретный ключ и проверяют ключ каждый раз, когда используется ваш код.
Вы можете узнать больше в библиотеке PHP NONCE от FullThrottle Development
bin2hex(mcrypt_create_iv(22, MCRYPT_DEV_URANDOM));
Пример вывода:
d2c63a605ae27c13e43e26fe2c97a36c4556846dd3ef
Готовьте, что «лучший» – относительный термин. У вас есть компромисс между безопасностью, уникальностью и скоростью. Вышеприведенный пример хорош для 99% случаев, хотя, если вы имеете дело с особенно чувствительными данными, вы можете прочитать о различии между MCRYPT_DEV_URANDOM и MCRYPT_DEV_RANDOM .
Наконец, существует RandomLib «для генерации случайных чисел и строк различной силы».
Обратите внимание, что до сих пор я предполагал, что вы хотите создать случайную строку , которая не совпадает с получением хеша из значения. Для последнего см. Password_hash .
Может быть, uniqid () – это то, что вам нужно?
uniqid – создать уникальный идентификатор
Вы можете использовать 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, af)
random_bytes()
доступно с PHP 7.0 (или используйте этот полиполк с 5.2 по 5.6 ):
$hash = bin2hex(random_bytes(16)); echo serialize($hash);
Вывод:
с: 32: "c8b2ca837488ff779753f374545b603c";
Я лично использую mod_unique_id apache для создания случайного уникального номера для хранения моих сеансов. Это очень просто использовать (если вы используете apache).
Для nonce посмотрите здесь http://en.wikipedia.org/wiki/Cryptographic_nonce, есть даже ссылка на библиотеку PHP.
Обычно я не управляю идентификаторами сеансов вручную. Я видел что-то в этом направлении, рекомендованное для смешивания вещей раньше, ив никогда не использовал себя, поэтому я не могу утверждать, что он лучше или хуже, чем по умолчанию (обратите внимание, что это используется с автогенером не с ручным управлением).
//md5 "emulation" using sha1 ini_set('session.hash_function', 1); ini_set('session.hash_bits_per_character', 5);
Используйте random_bytes (), если он доступен!
$length = 32;
if (function_exists("random_bytes")) { $bytes = random_bytes(ceil($lenght / 2)); $token = substr(bin2hex($bytes), 0, $lenght) }
Проверьте это на php.net
У разных людей будут разные best
способы. Но это мой путь:
rand-hash.php
: http://bit.ly/random-string-generator include()
в скрипте php, с которым вы работаете. Затем просто вызовите cc_rand()
. По умолчанию он возвращает случайную строку длиной 6 символов, которая может включать az, AZ,
и 0-9
. Вы можете передать length
чтобы указать, сколько символов должно возвращаться cc_rand()
. Пример:
cc_rand()
вернет что-то вроде: 4M8iro
cc_rand(15)
вернет нечто похожее на это: S4cDK0L34hRIqAS
Ура!