mysql ile apache uyumlu şifre oluştur

Aug 17 2020

Şu anda eski bir web sunucusunu taşıma sürecindeyim.

Eski sunucu, bir mysql tablosunda depolanan ve mod_auth_mysqletkinleştirilen kullanıcılarla temel kimlik doğrulama kullanır .

Apaches ile depolanan şifre ist sha1 işlevinde inşa SELECT sha1('secret')için çalışıyormod_auth_mysql

Maalesef mod_auth_mysqlartık desteklenmiyor. Bu yüzden mod_authn_dbdalternatif buldum .

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

Temel kimlik doğrulama ve sabit bir parola ile giriş yapabileceğim noktaya kadar her şeyi çalışır durumda tutmayı başardım

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

Sadece sha1 hash değerini kullanıcı tablosunda saklıyorum. mod_auth_mysqlMysql ( SELECT sha1('test')=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3) tarafından üretilen eski kabul edilen sağlamalar mod_authn_dbd bunu yapmaz.

Göre https://documentation.help/httpd-2.4-es/password_encryptions.html

SHA1 "{SHA}" + Base64 kodlu SHA-1 parolanın özeti.

Htpasswd tarafından oluşturulan şifreler kabul edilir.

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

Şimdi bu değeri a94a8fe5ccb19ba61c4c0873d391e987982fbbd3(şifre testi için veritabanımda saklanan qUqP5cyxm6YcTAhz05Hph5gvu9M=) mysql içinde (şifre testi için kabul edilen değer ) olarak dönüştürmem gerekiyor

Zaten denedim

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

ancak hiçbiri beklenen sonuçları vermez.

Ya mevcut şifre karmalarımı beklenen biçime dönüştürmek için bir yola ihtiyacım var ya da mod_authn_dbdmevcut sha1 özetimi kabul etmeye ikna ediyorum.

Herhangi bir yardım takdir edilecektir

Yanıtlar

1 Rouben Aug 17 2020 at 21:27

Kendi sorunuzu PHP örneği ile cevapladınız. PHP'deki pack () işlevi, ikili verilerin onaltılık temsillerini (bu, SHA-1 sağlamalarının tipik olarak insan tarafından okunabilir şekilde görüntülendiği) orijinal ikili (insan tarafından okunamayan) biçimlerine dönüştürür. Oluşturduğunuz SHA-1 hash'in bu ikili biçimine karşı to_base64 () çalıştırmanız gerekir:

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

Bu durumda, istediğiniz çıktıyı sadece MySQL ile alacaksınız.

JürgenSteinblock Aug 17 2020 at 21:07

Bu, soruma doğrudan bir cevap değil, ancak geçici bir çözüm olabilir, birinin aynı problemle karşılaştığı bir blog yazısı buldum.

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

yorumlarda php ile htpasswd uyumlu bir karmanın nasıl oluşturulacağına dair bir bağlantı vardır. Bunun htpasswd -bnskomutla aynı sonucu verdiğini doğruladım

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

Hiç kimse daha iyi bir çözüm bilmiyorsa (sadece mysql ve php olmadan), kullanıcı tablomu, parolanın bu şekilde saklandığı bir sütunla genişletebilirim. Biraz gereksiz ama işe yaramalı.