menghasilkan kata sandi yang kompatibel dengan apache dengan mysql
Saat ini saya sedang dalam proses memindahkan server web lama.
Server lama menggunakan autentikasi dasar dengan pengguna yang disimpan dalam tabel mysql dan mod_auth_mysql
diaktifkan.
Kata sandi disimpan dengan apaches build in sha1 function SELECT sha1('secret')
yang berfungsi untukmod_auth_mysql
Sayangnya mod_auth_mysql
tidak didukung lagi. Itu sebabnya saya temukan mod_authn_dbd
sebagai alternatif.
https://documentation.help/httpd-2.4-es/mod_authn_dbd.html
Saya sudah berhasil menjalankan semuanya hingga saya dapat login dengan autentikasi dasar dan kata sandi tetap
<Location />
AuthType Basic
AuthName "Test"
AuthBasicProvider dbd
Require valid-user
AuthDBDUserPWQuery "SELECT '{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=' FROM users WHERE user = %s"
</Location>
Saya hanya menyimpan hash sha1 di tabel pengguna. Sementara mod_auth_mysql
hash lama yang diterima yang dihasilkan oleh mysql ( SELECT sha1('test')=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
) mod_authn_dbd tidak.
Berdasarkan https://documentation.help/httpd-2.4-es/password_encryptions.html
SHA1 "{SHA}" + Intisari sandi SHA-1 berenkode Base64.
Kata sandi yang dibuat oleh htpasswd diterima.
htpasswd -bns user test
user:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=
Sekarang saya perlu mengonversi nilai ini a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
(disimpan di db saya untuk uji kata sandi) menjadi qUqP5cyxm6YcTAhz05Hph5gvu9M=
(nilai yang diterima untuk uji kata sandi) di dalam mysql
Saya sudah mencoba
SELECT to_base64(sha1('test')), to_base64(ucase(sha1('test'))), to_base64(lcase(sha1('test')));`
tetapi tidak ada yang memberikan hasil yang diharapkan.
Saya membutuhkan cara untuk mengubah hash kata sandi saya yang ada ke format yang diharapkan atau meyakinkan mod_authn_dbd
untuk menerima hash sha1 saya yang ada.
Bantuan apa pun akan dihargai
Jawaban
Anda menjawab pertanyaan Anda sendiri dengan contoh PHP. Fungsi pack () dalam PHP mengubah representasi heksadesimal dari data biner (yang biasanya ditampilkan oleh hash SHA-1 agar dapat dibaca manusia) ke dalam bentuk biner aslinya (yang tidak dapat dibaca manusia). Anda perlu menjalankan to_base64 () terhadap bentuk biner dari hash SHA-1 yang Anda buat seperti ini:
mysql> SELECT to_base64(unhex(sha1('test')));
+--------------------------------+
| to_base64(unhex(sha1('test'))) |
+--------------------------------+
| qUqP5cyxm6YcTAhz05Hph5gvu9M= |
+--------------------------------+
1 row in set (0.00 sec)
Dalam hal ini, Anda akan mendapatkan hasil yang diinginkan hanya dengan MySQL.
Ini bukan jawaban langsung untuk pertanyaan saya tetapi mungkin solusi. Saya menemukan posting blog di mana seseorang mengalami masalah yang sama.
http://nileshbansal.blogspot.com/2008/06/password-encryption-mysql-apache-and.html

di komentar ada tautan tentang cara membuat hash yang kompatibel dengan htpasswd dengan php. Saya mengkonfirmasi bahwa ini memberikan hasil yang sama dengan htpasswd -bns
perintah
function sha1_to_htpasswd ( $user, $sha )
{
return $user . ':{SHA}' . base64_encode( pack( "H" . strlen( $sha ), $sha ) );
}
Jika tidak ada yang tahu solusi yang lebih baik (hanya mysql dan tanpa php) saya akan memperluas tabel pengguna saya dengan kolom di mana kata sandi disimpan dengan cara ini. Agak berlebihan tetapi harus berhasil.