สร้างรหัสผ่านที่เข้ากันได้กับ apache ด้วย mysql

Aug 17 2020

ขณะนี้ฉันกำลังดำเนินการย้ายเว็บเซิร์ฟเวอร์เก่า

เซิร์ฟเวอร์เก่าใช้การรับรองความถูกต้องพื้นฐานกับผู้ใช้ที่เก็บไว้ในตาราง mysql และmod_auth_mysqlเปิดใช้งาน

รหัสผ่านไม่ถูกเก็บไว้ด้วย apaches build ในฟังก์ชัน sha1 SELECT sha1('secret')ซึ่งใช้ได้กับmod_auth_mysql

ขออภัยmod_auth_mysqlไม่ได้รับการสนับสนุนอีกต่อไป นั่นเป็นเหตุผลที่ฉันพบmod_authn_dbdว่าเป็นทางเลือก

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

ฉันยังจัดการทุกอย่างให้พร้อมใช้งานจนถึงจุดที่ฉันสามารถเข้าสู่ระบบด้วยการรับรองความถูกต้องพื้นฐานและรหัสผ่านคงที่

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

ฉันเก็บเฉพาะแฮช sha1 ในตารางผู้ใช้ แม้ว่าmod_auth_mysqlแฮชที่ยอมรับแบบเก่าที่สร้างโดย mysql ( SELECT sha1('test')=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3) mod_authn_dbd จะไม่มี

ตาม https://documentation.help/httpd-2.4-es/password_encryptions.html

SHA1 "{SHA}" + ข้อมูลย่อย SHA-1 ที่เข้ารหัส Base64 ของรหัสผ่าน

ยอมรับรหัสผ่านที่สร้างโดย htpasswd

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

ตอนนี้ฉันต้องแปลงค่านี้a94a8fe5ccb19ba61c4c0873d391e987982fbbd3(เก็บไว้ในฐานข้อมูลของฉันสำหรับการทดสอบรหัสผ่าน) เป็นqUqP5cyxm6YcTAhz05Hph5gvu9M=(ค่าที่ยอมรับสำหรับการทดสอบรหัสผ่าน) ภายใน mysql

ฉันพยายามแล้ว

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

แต่ไม่มีใครให้ผลลัพธ์ที่คาดหวัง

ฉันต้องการวิธีแปลงแฮชรหัสผ่านที่มีอยู่ให้เป็นรูปแบบที่คาดไว้หรือโน้มน้าวmod_authn_dbdให้ยอมรับแฮช sha1 ที่มีอยู่ของฉัน

ความช่วยเหลือใด ๆ จะได้รับการชื่นชม

คำตอบ

1 Rouben Aug 17 2020 at 21:27

คุณตอบคำถามของคุณเองด้วยตัวอย่าง PHP ฟังก์ชัน pack () ใน PHP จะแปลงการแสดงเลขฐานสิบหกของข้อมูลไบนารี (ซึ่งโดยทั่วไปแล้วแฮช SHA-1 จะแสดงว่ามนุษย์สามารถอ่านได้) เป็นรูปแบบไบนารีดั้งเดิม (ที่มนุษย์อ่านไม่ได้) คุณต้องเรียกใช้ to_base64 () กับรูปแบบไบนารีของแฮช SHA-1 ที่คุณสร้างดังนี้:

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

ในกรณีนี้คุณจะได้ผลลัพธ์ที่ต้องการด้วย MySQL เท่านั้น

JürgenSteinblock Aug 17 2020 at 21:07

นี่ไม่ใช่คำตอบโดยตรงสำหรับคำถามของฉัน แต่อาจเป็นวิธีแก้ปัญหาเมื่อฉันพบโพสต์บล็อกที่มีคนพบปัญหาเดียวกัน

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

ในความคิดเห็นมีลิงค์เกี่ยวกับวิธีสร้างแฮชที่เข้ากันได้กับ htpasswd กับ php ฉันยืนยันว่าสิ่งนี้ให้ผลลัพธ์เหมือนกับhtpasswd -bnsคำสั่ง

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

หากไม่มีใครรู้วิธีแก้ปัญหาที่ดีกว่า (แค่ mysql และไม่มี php) ฉันจะขยายตารางผู้ใช้ของฉันด้วยคอลัมน์ที่เก็บรหัสผ่านด้วยวิธีนี้ ซ้ำซ้อนเล็กน้อย แต่ควรใช้งานได้