gerar senha compatível com apache com mysql

Aug 17 2020

Atualmente, estou migrando um servidor da 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 anexos construídos na função sha1 SELECT sha1('secret')que funciona paramod_auth_mysql

Infelizmente mod_auth_mysqlnão é mais compatível. É por isso que encontrei mod_authn_dbdcomo alternativa.

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

Eu já consegui colocar tudo em funcionamento até o ponto em que posso fazer o login com autenticação básica e uma senha fixa

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

Eu apenas armazeno 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 com https://documentation.help/httpd-2.4-es/password_encryptions.html

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

As senhas geradas por htpasswd são aceitas.

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

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

Ja tentei

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

mas nenhum produz os resultados esperados.

Eu 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

Respostas

1 Rouben Aug 17 2020 at 21:27

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 é como os hashes SHA-1 são normalmente exibidos como sendo legíveis por humanos) em sua forma binária original (não legível por humanos). Você precisa executar to_base64 () nesta forma binária do hash SHA-1 que você gera, assim:

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.

JürgenSteinblock Aug 17 2020 at 21:07

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

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

nos comentários há um link sobre como criar um hash compatível com htpasswd com php. Confirmei que isso dá o mesmo resultado que o htpasswd -bnscomando

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

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