2010-02-19 4 views

ответ

8

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

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

Взгляните на PHP Security Consortium: Password Hashing, они дают хорошую статью со слабыми местами и улучшают безопасность с помощью хэширования.

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

Вы можете проверить больше на PHP NONCE Library from FullThrottle Development

+0

Спасибо. Im собираюсь заглянуть в него –

+5

md5 взломан, используйте sha1 –

+4

SHA1 также можно сломать (по крайней мере теоретически). Подробнее см. В разделе «Обзор безопасности хеш-функции» (https://en.wikipedia.org/wiki/Hash_function_security_summary). Я бы пошел с SHA256 или SHA512. – colan

0

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

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

8

Возможно, uniqid() - это то, что вам нужно?

uniqid — Generate a unique ID

+0

Прямо сейчас, я использую uniqid(), но я читал, что использование md5 на uniqid() не очень хорошо. –

+7

Почему вы хотите использовать md5? Просто используйте uniqid. –

0

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

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

Я не использую встроенные функции php session, так как у меня нет большого контроля над ними и, возможно, небезопасно. –

+2

Я могу заверить вас, что они более безопасны, чем любая функция, которую вы считаете безопасной. –

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

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

d2c63a605ae27c13e43e26fe2c97a36c4556846dd3ef 

Bare в виду, что "лучше" это понятие относительное. У вас есть компромисс между безопасностью, уникальностью и скоростью. Вышеприведенный пример хорош для 99% случаев, хотя, если вы имеете дело с особенно чувствительными данными, вы можете прочитать о difference between MCRYPT_DEV_URANDOM and MCRYPT_DEV_RANDOM.

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

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

+5

Просто немного PSA: 'mcrypt_create_iv' устарел в PHP 7.1.0. Вместо этого используйте ['random_bytes'] (http://uk1.php.net/manual/en/function.random-bytes.php). –

-3

Разные люди будут иметь разные 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

Это не генерирует криптографически безопасные значения, поскольку использует ['rand()'] (https://secure.php.net/manual/en/function.rand.php). – 0b10011

4

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

0

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

$length = 32;

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

Check it on php.net

Смежные вопросы