сгенерировать совместимый с Apache пароль с помощью MySQL

сгенерировать совместимый с Apache пароль с помощью MySQL

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

Старый сервер использует базовую аутентификацию, при этом пользователи хранятся в таблице MySQL и mod_auth_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 в таблице user. В то время как старые 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.

Любая помощь будет оценена по достоинству.

решение1

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

решение2

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

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), я бы, вероятно, расширил свою таблицу пользователей столбцом, где хранится пароль, таким образом. Немного избыточно, но должно работать.

Связанный контент