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_mysql
habilitados.
A senha é armazenada com apaches compilados na função sha1 SELECT sha1('secret')
que funciona paramod_auth_mysql
Infelizmente mod_auth_mysql
não é mais suportado. É por isso que encontrei mod_authn_dbd
uma 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_mysql
hashes 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_dbd
a 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
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 -bns
o 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.