сгенерировать пароль, совместимый с apache, с помощью mysql
В настоящее время я занимаюсь переносом старого веб-сервера.
Старый сервер использует базовую аутентификацию с mod_auth_mysql
включенными пользователями, хранящимися в таблице mysql .
Пароль хранится в apache, встроенной в функцию sha1, SELECT sha1('secret')
которая работает дляmod_auth_mysql
К сожалению, mod_auth_mysql
больше не поддерживается. Вот почему я нашел mod_authn_dbd
в качестве альтернативы.
https://documentation.help/httpd-2.4-es/mod_authn_dbd.html
Мне уже удалось все запустить и запустить до тех пор, пока я не смогу войти в систему с базовой аутентификацией и фиксированным паролем.
<Location />
AuthType Basic
AuthName "Test"
AuthBasicProvider dbd
Require valid-user
AuthDBDUserPWQuery "SELECT '{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=' FROM users WHERE user = %s"
</Location>
Я храню только хеш sha1 в пользовательской таблице. В то время как старые mod_auth_mysql
принятые хэши, сгенерированные mysql ( SELECT sha1('test')=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
), mod_authn_dbd нет.
Согласно с https://documentation.help/httpd-2.4-es/password_encryptions.html
SHA1 "{SHA}" + дайджест пароля SHA-1 в кодировке Base64.
Принимаются пароли, созданные htpasswd.
htpasswd -bns user test
user:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=
Теперь мне нужно преобразовать это значение a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
(хранящееся в моей базе данных для проверки пароля) в qUqP5cyxm6YcTAhz05Hph5gvu9M=
(принятое значение для проверки пароля) внутри mysql
Я уже пробовал
SELECT to_base64(sha1('test')), to_base64(ucase(sha1('test'))), to_base64(lcase(sha1('test')));`
но ни один из них не дает ожидаемых результатов.
Мне либо нужен способ преобразовать мои существующие хэши паролей в ожидаемый формат, либо убедить mod_authn_dbd
принять мой существующий хеш sha1.
Любая помощь будет оценена
Ответы
Вы ответили на свой вопрос примером PHP. Функция pack () в PHP преобразует шестнадцатеричные представления двоичных данных (которые хэши SHA-1 обычно отображаются как доступные для чтения человеком) в их исходную двоичную (не читаемую человеком) форму. Вам нужно запустить to_base64 () для этой двоичной формы хэша SHA-1, который вы сгенерировали следующим образом:
mysql> SELECT to_base64(unhex(sha1('test')));
+--------------------------------+
| to_base64(unhex(sha1('test'))) |
+--------------------------------+
| qUqP5cyxm6YcTAhz05Hph5gvu9M= |
+--------------------------------+
1 row in set (0.00 sec)
В этом случае вы получите желаемый результат только с MySQL.
Это не прямой ответ на мой вопрос, но может быть обходным путем. Я нашел сообщение в блоге, где кто-то столкнулся с той же проблемой.
http://nileshbansal.blogspot.com/2008/06/password-encryption-mysql-apache-and.html

в комментариях есть ссылка на то, как создать htpasswd-совместимый хеш с php. Я подтвердил, что это дает тот же результат, что и htpasswd -bns
команда
function sha1_to_htpasswd ( $user, $sha )
{
return $user . ':{SHA}' . base64_encode( pack( "H" . strlen( $sha ), $sha ) );
}
Если никто не знает лучшего решения (просто mysql и без php), я бы вероятно расширил свою таблицу пользователей столбцом, в котором пароль хранится таким образом. Немного избыточно, но это должно работать.