В PHP я заметил, что некоторые фреймворки используют функцию microtime () для генерации токенов сброса пароля, как в:
$token = md5(microtime());
Это проблема безопасности? Если злоумышленник может точно синхронизировать часы с сервером, они могут перетащить токен. Синхронизация 1сек потребует только 1 000 000 попыток, и это не слишком сумасшедшая проблема.
Насколько вероятна эта атака для успеха? Нужно ли генерировать токены с / dev / urandom или openssl_pseudo_bytes ()? Является ли microtime () плохой практикой?
Да, это проблема безопасности! Создание жетонов со временем – очень плохая практика. Burp Suite делает тривиальным для злоумышленника жестовые жетоны, которые предсказуемы, а токены, основанные на времени, очень предсказуемы. Burp позволяет кому-то легко собирать жетоны и выполнять статистический анализ для определения энтропии. Используя эту информацию, вы можете легко предсказать будущие токены.
Помните, что злоумышленнику нужно только сразу это сделать. Неправильное использование миллионов раз не имеет значения.
Вот полезная (и недавняя) статья StackOverflow о генерации токенов, которая может быть вам полезной: реализация маркера аутентификации веб-службы REST
Токены всегда должны создаваться наугад, а не микро-время. Теперь, чтобы дать дополнительную защиту (потому что, давайте обратимся к этому еще раз: компьютеры не могут ничего сделать, кроме вычисления материала), вы захотите увидеть пример php: http://php.net/manual/de/function.srand.php Также см. http://php.net/manual/de/function.chr.php, чтобы легко создать «полностью» случайную строку. Вот как я это делаю
mt_srand((double) microtime() * 1000000); function random_string ($length = 16) { $string = ""; for ($n = 0; $n < count($length); $n++) $string .= chr(rand(32, 126)); return $string; }
Да, это (я думаю).
Хакер может угадать пароль в течение 1-2 часов. (Если сервер использует предел, сколько можно сделать сбрасыванием, хакер может предотвратить его, используя Ботнет или имея много времени и много испытаний.
Если бы я был вами, я бы добавил статическую соль. Соль следует загружать из конфига (или другого безопасного места). Соль не должна устанавливаться самим сервером или кем бы то ни было. Он должен быть сгенерирован реальным случайным API (google должен помочь вам, но я предполагаю, что random.org предлагает один).
Если вы не можете использовать этот API, псевдосоль также должна помочь, если шейкер не знает, когда сервер был настроен (или администратор сервера иногда может его удалять, но не автоматически!).
Пример:
$salt = null; include('protectedDir/salt.php'); // Here should stand "$salt = ''" if ($salt == null){ // Using real random api file_put_contents('protectedDir/salt.php', '<?php \$salt = \'$salt\'; ?>)"; } $resetKey = sha1(microtime() . $salt);
в$salt = null; include('protectedDir/salt.php'); // Here should stand "$salt = ''" if ($salt == null){ // Using real random api file_put_contents('protectedDir/salt.php', '<?php \$salt = \'$salt\'; ?>)"; } $resetKey = sha1(microtime() . $salt);
// Может содержать ошибки. Непроверенные. Это всего лишь пример и не должен быть реализован путем копирования и вставки.
Если у хака есть доступ к файлу php («protectedDir / salt.php») «исходный код», он также сможет видеть конфигурацию базы данных. И это была бы большая проблема.