Проверка введенного пароля по файлу, содержащему хэши паролей APR1-MD5 - PullRequest
2 голосов
/ 06 января 2012

Я работаю на веб-сайте, который пытается переключиться с проверки подлинности Apache на проверку подлинности PHP для имени пользователя / пароля при входе в систему.В настоящее время пароли хранятся в файле и зашифрованы в собственном формате Apache md5 (например, $apr1$z6hoasr5$0Kk7p/8Hfhy9nBxu/hFUj1).

Пароли не хранятся в базе данных.

Теперь япишу скрипт входа в PHP.У меня вопрос, как я могу проверить, совпадает ли введенный пароль с зашифрованным паролем в файле?Я нашел код для генерации APR1-MD5 на основе простого текстового пароля, но это НЕ то, что мне нужно, поскольку он генерирует коды, отличные от кодов в файле.

Короче говоря, есть ли способчтобы идентично проверить, действительно ли введенный пароль сохранен в файле?

Я знаю, что у Apache есть открытый исходный код для их генерации, но код написан на C, о котором я почти ничего не знаю.

Конечно, есть способ перейти с аутентификации Apache на PHP без изменения пароля каждого пользователя?

Ответы [ 2 ]

4 голосов
/ 11 января 2012

Насколько я понимаю, пароль приходит из вашей функции входа в систему. И вы должны проверить этот пароль по хешу APR1-md5. Если на вашей странице входа нет имени пользователя, поиск будет очень трудным. Но если у вас есть имена пользователей для соответствующих паролей, это может быть достигнуто:

Предположим, что функция входа в систему отправляет два параметра: $ username и $ password. Вызовите файл паролей APRI-md5 как «password.txt». Метод, который я объясню, работает, только когда у вас есть имена пользователей в файле password.txt и имена пользователей из сценария входа в систему совпадают с именами в файле password.txt.

$apr1$z6hoasr5$0Kk7p/8Hfhy9nBxu/hFUj1 хеш пароля состоит из трех частей:

apr1 = идентификатор формата [статический, одинаковый для каждой строки пароля]

z6hoasr5 = солевой текст [различен для каждого пароля]

0Kk7p/8Hfhy9nBxu/hFUj1 = настоящая хэш-строка md5

Этот метод не может сгенерировать один и тот же пароль, даже если введенный текст одинаков, если только вы не используете тот же солевой текст. Таким образом, чтобы создать ту же хеш-строку и сравнить ее с вводом, вы должны знать, что такое солт-текст для данного пользователя.

Например, когда вы получаете $ username и $ password из сценария входа в систему, вы должны найти имя пользователя в файле password.txt. Затем вы должны извлечь текстовую часть соли из password.txt ( "z6hoasr5" в вашем примере). Затем, используя этот соленый текст и $ пароль [из логина], вы должны сгенерировать хеш APR1-md5 (Вы можете изменить http://www.php.net/manual/en/function.crypt.php#73619, чтобы ввести $ salt в качестве входного параметра. Таким образом, вы можете отправлять соль и текст и получать хэш пароля). Если пароль правильный, вновь созданная хеш-строка с использованием солт-текста в password.txt будет такой же, как и password.txt. Затем вы можете выполнить сравнение строк, чтобы проверить, действителен ли пароль.

0 голосов
/ 12 февраля 2015

Я столкнулся с этим сам и подумал, что опубликую хорошее решение.Я начал с предыдущей работы людей и превратил ее в проверенное и упакованное решение .

composer.json:

"require": {
  "whitehat101/apr1-md5": "~1.0"
}

Использование:

// Check plaintext password against an APR1-MD5 hash
APR1_MD5::check('plaintext', '$apr1$z6hoasr5$0Kk7p/8Hfhy9nBxu/hFUj1'); // bool

// Hash a password with a known salt
echo APR1_MD5::hash('PASSWORD', 'z6hoasr5');

// Hash a password with a secure random salt
echo APR1_MD5::hash('PASSWORD');

Стесняюсь делать ввод / вывод для файлов .htpasswd, я думаю, что эта библиотека в значительной степени охватывает все, что можно было бы сделать с хэшами Apache APR1-MD5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...