Я создаю приложение, которое будет иметь пользовательскую базу, и я нахожусь в точке обеспечения входа в систему. Я довольно плохо знаком с программированием (и PHP), но мои усилия до сих пор указывали на использование Crypt()
и хешированной соли Blowfish.
Прежде чем идти дальше, позвольте мне указать, что В данный момент я не заинтересован в phpass .
В документации crypt()
пользователь недавно опубликовал это:
<?php
$salt = substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22);
?>
Предназначен для использования в системах
где mt_getrandmax () == 2147483647.
Созданная соль будет 128 бит
длина, дополненная до 132 бит, а затем
выражается в 22 base64 символов.
(CRYPT_BLOWFISH использует только 128 бит для
соль, хотя есть 132
биты в 22 символа base64. если ты
изучить ввод CRYPT_BLOWFISH и
вывод, вы можете видеть, что он игнорирует
последние четыре бита на входе и устанавливает
их к нулю на выходе.)
Обратите внимание, что старшие биты
четыре 32-битных меча, возвращенные
mt_rand () всегда будет нулевым (так как
mt_getrandmax == 2 ^ 31), поэтому только 124
128 бит будут псевдослучайными. я
нашел, что приемлемо для моего
применение.
Я проверил свой сервер, и действительно, mt_getrandmax () возвращает 2147483647. Я попытался просмотреть документацию, чтобы понять, что на самом деле делает вышеуказанный код - код pack()
N4 для 32-битной строки (порядок байтов с прямым порядком байтов) ??) повторил 4 раза ... что я предполагаю, поэтому есть 4 mt_rand()
аргументы.
Я не понимаю, почему он заменяет +
на .
и назначает 22 символа base64 (не то, чтобы я полностью понимал, что такое base64.)
Было рекомендовано посмотреть на openssl_random_pseudo_bytes()
для моего случайного образования соли, так как предыдущий метод, на который я смотрел, ограничивался только 1234567890abcdefghijklmnopqrstuvwxyz
.
Предположительно, была ошибка до 5.3.4 , из-за которой openssl_random_pseudo_bytes()
работал мучительно медленно, иногда вызывая ошибки тайм-аута. Я не уверен, стоит ли мне пытаться использовать openssl_random_pseudo_bytes()
с Crypt()
или что-то подобное описанному выше, используя mt_rand()
и pack()
.
Я пытаюсь лучше понять, как работают все эти элементы и что они делают концептуально, а не просто использовать один из них, не понимая его, для достижения моей цели; Я пытаюсь научиться: P
Может кто-нибудь помочь мне понять различные элементы на работе здесь или, по крайней мере, направить меня в базу знаний, где я могу прочитать об этом? Я думаю, что наиболее скрытным компонентом является понимание различных форматов / терминологии (base64, ascii, hexdec, bit, byte и т. Д.), А также, в конце концов, как получить довольно безопасную соль для использования с моими паролями.