gerar senha compatível com apache com mysql

gerar senha compatível com apache com mysql

Atualmente estou no processo de migração de um servidor web antigo.

O servidor antigo usa autenticação básica com usuários armazenados em uma tabela mysql e mod_auth_mysqlhabilitados.

A senha é armazenada com apaches compilados na função sha1 SELECT sha1('secret')que funciona paramod_auth_mysql

Infelizmente mod_auth_mysqlnão é mais suportado. É por isso que encontrei mod_authn_dbduma alternativa.

https://documentation.help/httpd-2.4-es/mod_authn_dbd.html

Já consegui colocar tudo em funcionamento até conseguir fazer login com autenticação básica e senha fixa

<Location />
        AuthType Basic
        AuthName "Test"
        AuthBasicProvider dbd
        Require valid-user
        AuthDBDUserPWQuery "SELECT '{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=' FROM users WHERE user = %s"
</Location>

Eu armazeno apenas o hash sha1 na tabela do usuário. Enquanto os antigos mod_auth_mysqlhashes aceitos gerados por mysql( SELECT sha1('test')=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3) mod_authn_dbd não.

De acordo comhttps://documentation.help/httpd-2.4-es/password_encryptions.html

SHA1 "{SHA}" + resumo SHA-1 codificado em Base64 da senha.

Senhas geradas por htpasswd são aceitas.

htpasswd -bns user test
user:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=

Agora preciso converter esse valor a94a8fe5ccb19ba61c4c0873d391e987982fbbd3(armazenado em meu banco de dados para teste de senha) para qUqP5cyxm6YcTAhz05Hph5gvu9M=(valor aceito para teste de senha) dentro do mysql

eu já tentei

SELECT to_base64(sha1('test')), to_base64(ucase(sha1('test'))), to_base64(lcase(sha1('test')));`

mas nenhum produz os resultados esperados.

Preciso de uma maneira de converter meus hashes de senha existentes para o formato esperado ou convencer mod_authn_dbda aceitar meu hash sha1 existente.

Qualquer ajuda seria apreciada

Responder1

Você respondeu sua própria pergunta com o exemplo do PHP. A função pack() em PHP converte representações hexadecimais de dados binários (que é o que os hashes SHA-1 normalmente são exibidos para serem legíveis por humanos) em sua forma binária original (legível por não humanos). Você precisa executar to_base64() nesta forma binária do hash SHA-1 gerado da seguinte forma:

mysql> SELECT to_base64(unhex(sha1('test')));
+--------------------------------+
| to_base64(unhex(sha1('test'))) |
+--------------------------------+
| qUqP5cyxm6YcTAhz05Hph5gvu9M=   |
+--------------------------------+
1 row in set (0.00 sec)

Neste caso, você obterá a saída desejada apenas com MySQL.

Responder2

Esta não é uma resposta direta à minha pergunta, mas pode ser uma solução alternativa. Encontrei uma postagem no blog onde alguém teve o mesmo problema.

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

captura de tela

nos comentários há um link de como criar um hash compatível com htpasswd com php. Eu confirmei que isso dá o mesmo resultado que htpasswd -bnso comando

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

Se ninguém conhece uma solução melhor (apenas mysql e sem php), eu provavelmente estenderia minha tabela de usuários com uma coluna onde a senha está armazenada desta forma. Um pouco redundante, mas deve funcionar.

informação relacionada