1а) Стойкость шифрования - требование в пределах 4..31. См. http://php.net/manual/en/function.crypt.php
1б) См. 1а
1с) См. 1а. «соль» не должна быть случайной, иначе вы не сможете регенерировать тот же хеш для заданного ввода — см. 3.
2а) Строго говоря, все, кроме хэша (на случай компрометации БД). Кроме того, сохраните свою соль в файле, недоступном в корне документа веб-сервера, и включите его. Установите для него максимально строгие разрешения; в идеале только чтение для службы веб-хостинга (например, apache), без прав на запись или выполнение. Строго говоря, зависит от того, насколько вы хотите защищаться от хакеров. Отсутствие хранения соли только усложняет жизнь; им по-прежнему нужно правильно обрабатывать данные, вводимые в алгоритм, но зачем упрощать?
2b) VARCHAR(32) должен подойти для иглобрюха, если не хранить хэш
3) Предполагая, что вы уже запустили надлежащий код предотвращения инъекций и т. д., поэтому, пожалуйста, не просто копируйте нижеприведенное вслепую (и в идеале используйте PDO вместо расширения mysql). Приведенное ниже относится к Blowfish, SHA-256 и SHA-512, которые возвращают соль в хеше. Потребуется модификация для других алгоритмов...
//store this in another file outside web directory and include it
$salt = '$2a$07$somevalidbutrandomchars$'
...
//combine username + password to give algorithm more chars to work with
$password_hash = crypt($valid_username . $valid_password, $salt)
//Anything less than 13 chars is a failure (see manual)
if (strlen($password_hash) < 13 || $password_hash == $salt)
then die('Invalid blowfish result');
//Drop the salt from beginning of the hash result.
//Note, irrespective of number of chars provided, algorithm will always
//use the number defined in constant CRYPT_SALT_LENGTH
$trimmed_password_hash = substring($password_hash, CRYPT_SALT_LENGTH);
mysql_query("INSERT INTO `users` (username,p assword_hash) VALUES '$valid_username', '$trimmed_password_hash'");
...
$dbRes = mysql_query("SELECT password_hash FROM `users` WHERE username = '$user_input_username' LIMIT 1");
//re-apply salt to output of database and re-run algorithm testing for match
if (substring($salt, CRYPT_SALT_LENGTH) . mysql_result($dbRes, 0, 'password_hash') ) ===
crypt($user_input_username . $user_input_password, $salt) ) {
//... do stuff for validated user
}
person
Matt
schedule
13.02.2011