сгенерировать пароль, совместимый с apache, с помощью mysql

В настоящее время я занимаюсь переносом старого веб-сервера.

Старый сервер использует базовую аутентификацию с пользователями, хранящимися в таблице mysql, и mod_auth_mysql включен.

Пароль хранится в apache build в функции 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_authnps , не соответствует ) mod_authnps. .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.

Любая помощь будет принята с благодарностью

1
задан 18 August 2020 в 15:50
2 ответа

Вы ответили на свой вопрос с помощью примера 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.

1
ответ дан 4 January 2021 в 08:45

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

http://nileshbansal.blogspot.com/2008/06/password-encryption-mysql-apache-and.html

screenshot

в комментариях есть ссылка на то, как создать совместимый с htpasswd хеш с php. Я подтвердил, что это дает тот же результат, что и команда htpasswd -bns команда

function sha1_to_htpasswd ( $user, $sha )
{
return $user . ':{SHA}' . base64_encode( pack( "H" . strlen( $sha ), $sha ) );
}

Если никто не знает лучшего решения (просто mysql и без php) Я бы вероятно расширил свою таблицу пользователей столбцом, в котором пароль хранится таким образом. Немного избыточно, но должно работать.

0
ответ дан 4 January 2021 в 08:45

Теги

Похожие вопросы