Все,
Я использую следующую функцию PHP для слияния и хэш-паролей пользователей для веб-приложения:
function stringHashing($password,$salt){ $hashedString=$password.$salt; for ($i=0; $i<50; $i++){ $hashedString=hash('sha512',$password.$hashedString.$salt); } return $hashedString; }
Каков наилучший способ хранения результирующей строки в MySQL? Я полагаю, это фиксированное поле CHAR? Как мне рассчитать правильную длину?
Благодаря,
JDelage
Ну, SHA512 всегда вернет 512-битный хеш, метод с двумя аргументами hash()
возвращает это как шестнадцатеричные цифры, так что это 512 бит / 8 бит на байт * 2 шестнадцатеричных цифры на байт = 128 шестнадцатеричных цифр
CHAR(128)
должен быть тем, что вам нужно
Я всегда использовал поле varchar с более чем необходимой длиной. Что, если, по дороге, вы хотите изменить свой алгоритм? Вы должны изменить таблицу, которая раздражает.
SHA512 будет генерировать 128-символьную строку, поэтому дайте поле, по крайней мере, этому.
Кроме того, я должен указать, что вы много тратите впустую. Вы не добавляете слишком много безопасности, повторяя одну и ту же соль и хеш снова и снова. В конечном итоге вам все равно понадобится соль и пароль, все остальное в алгоритме останется постоянным.
Если кто-то знает вашу соль, у них, вероятно, есть исходный код, который поможет им повторить его 50 раз. В этом свете, учитывая тривиальное преимущество безопасности для рекурсивного повторного хэширования с фиксированным счетом, я думал, что предлагаю использовать SHA2 () из MySQL 5.5.5+ в качестве более простой альтернативы:
mysql_query("SELECT SHA2(CONCAT('$password','$salt'), 512) AS `hash`;");
Каким будет ваш VARCHAR(128)
готовый к INSERT
/ UPDATE
.