การรักษารหัสผ่านฐานข้อมูล


18

ดูโครงสร้างของเว็บไซต์ที่ใช้ PHP / MySQL ส่วนใหญ่ที่ฉันเห็นมันไม่ยากที่จะแยกแยะรหัสผ่านฐานข้อมูลถ้าคุณขุดบิตเนื่องจากมีไฟล์ติดตั้งหรือการกำหนดค่าบางอย่างที่เก็บข้อมูลสำหรับบันทึก ลงในฐานข้อมูล นอกเหนือจากข้อควรระวังเบื้องต้นของการทำให้แน่ใจว่าสิทธิ์ของฐานข้อมูลของฉันถูก จำกัด อย่างเหมาะสมสำหรับการร้องขอระยะไกลตัวเลือกใดบ้างที่ฉันสามารถนำไปใช้ในโครงการของตัวเองเพื่อปกป้องข้อมูลนี้


1
ในการชี้แจง - คุณกำลังถามเกี่ยวกับการจัดเก็บข้อมูลรับรองเพื่อเข้าสู่ระบบฐานข้อมูลจากเว็บไซต์และไม่ใช่วิธีการจัดเก็บรหัสผ่านสำหรับผู้ใช้เว็บไซต์ในฐานข้อมูลอย่างถูกต้องหรือไม่
Joe

แก้ไข; นั่นคือสิ่งที่ฉันได้รับ
Kaji

คำตอบ:


10

ไม่ใช่คำตอบโดยตรงเกี่ยวกับการจัดเก็บรหัสผ่าน แต่โดยทั่วไปฉันใช้การเชื่อมต่อฐานข้อมูลอย่างน้อยสองครั้งเมื่อสร้าง webapps - ใช้งาน 99% ของเวลาสำหรับกิจกรรมที่เกี่ยวข้องกับผู้ใช้ด้วยสิทธิ์ที่ จำกัด และอีกอันใช้สำหรับฟังก์ชั่น 'admin' (ลบผู้ใช้ ฯลฯ )

ในบางกรณีที่ฉันกำลังติดตั้งแพคเกจของคนอื่นฉันจะติดตั้งสองอินสแตนซ์ ... อินสแตนซ์สาธารณะที่มีการเข้าถึงฐานข้อมูลเพื่อทำสิ่งที่ผู้ใช้ทั่วไปเท่านั้นและอีกอินสแตนซ์ที่สองที่ จำกัด IP เครือข่ายย่อยในพื้นที่ของฉัน (อาจเป็นได้ในเครื่องอื่น) ที่จะต้องใช้สำหรับกิจกรรมประเภท 'ผู้ดูแลระบบ' ไม่มีใครสามารถแก้ไขตาราง ฯลฯ ได้ แต่ ... ฉันต้องการเข้าใช้งานผ่านเครื่องมือฐานข้อมูลพื้นฐานมากกว่าที่จะอนุญาตให้เว็บแอปรันงานอัพเดทของตัวเองที่ไม่ได้รับการตรวจสอบ

คุณสามารถใช้งานได้มากขึ้นและเพิ่มการเชื่อมต่อเพิ่มเติมสำหรับงานที่ได้รับมอบหมาย ... ดังนั้นการสร้างผู้ใช้งาน & การจัดการรหัสผ่านต้องผ่านผู้ใช้ที่มีสิทธิ์พิเศษในตารางผู้ใช้เข้าสู่ระบบมีฐานข้อมูลส่วนตัวเพื่อรับรองความถูกต้อง ฯลฯ

ด้วยวิธีนี้หากมีการโจมตีการฉีด sql บนหน้าเว็บส่วนใหญ่มันไม่สามารถทำอะไรที่สำคัญ - ไม่เห็นแฮชรหัสผ่านไม่สามารถเพิ่มผู้ใช้ผู้ดูแลระบบใหม่ (ไม่ว่าพวกเขาจะสามารถทำได้ อะไรก็ตาม) ฯลฯ มันยังคงไม่ช่วยถ้าพวกเขาจัดการเพื่อรับเปลือกบนเครื่องของคุณ แต่มันจะช้าลง


1
เราทำสิ่งที่คล้ายกัน อย่างไรก็ตามโดยทั่วไปเราสร้างบัญชีใหม่สำหรับผู้ใช้แต่ละราย / แอปพลิเคชันของฐานข้อมูลแทนที่จะทำโดยการใช้งาน สิ่งนี้จะช่วยแก้ปัญหาสองประการสำหรับเรา - 1) เราสามารถแยกการใช้ฐานข้อมูลในเครื่องมือเช่น OEM (เช่นเราสามารถดูว่าใครกำลังตอกฐานข้อมูลด้วยความละเอียด) และ 2) เราสามารถกำหนดสิ่งที่ผู้ใช้แต่ละคนเห็นและเข้าถึงได้ภายใน ฐานข้อมูล
ScottCher

7

ใช้ครั้งเดียวรหัสผ่าน , Kerberos , LDAPหรือสิ่งอื่นที่จะเก็บข้อมูลบัญชีของคุณและตรวจสอบสิทธิ์ผู้ใช้ / อนุมัติ บริการไดเรกทอรีเป็นวิธีที่ดีในการจัดเก็บข้อมูลผู้ใช้และใช้เป็นข้อมูลแบ็กเอนด์ไปยังบัญชี


4

ฉันเป็นแฟนตัวยงของการใช้การพิสูจน์ตัวตน 'Ident' ของ PostgreSQL บนซ็อกเก็ตท้องถิ่นทุกครั้งที่ทำได้ ด้วยวิธีนี้ผู้ใช้ในพื้นที่จะถูกแมปโดยตรงกับผู้ใช้ Unix / Windows ของเครื่องคอมพิวเตอร์และฉันไม่ต้องกังวลเกี่ยวกับการจัดเก็บรหัสผ่านเลย ฉันไม่คิดว่านี่เป็นตัวเลือกใน MySQL เลย

ที่ฐานข้อมูลและเว็บเซิร์ฟเวอร์อยู่บนเครื่องสองเครื่องฉันใช้รหัสผ่าน MD5 บน SSL: หากศัตรูมีการเข้าถึงเซิร์ฟเวอร์ส่วนหน้าของฉันมันเป็นเรื่องของเวลาก่อนที่เขาจะเข้าใจวิธีการสื่อสารกับฐานข้อมูล


3

หากคุณใช้. NET Framework คุณสามารถดูได้โดยใช้สตริงการเชื่อมต่อที่เข้ารหัส ฉันไม่ทราบว่าสิ่งนั้นเป็นไปได้ในภาษา / กรอบงานอื่น ๆ หรือไม่ แต่นั่นจะเป็นอีกวิธีหนึ่งในการป้องกันเพื่อให้แน่ใจว่าการเชื่อมต่อของคุณจะไม่ถูกบุกรุก

นอกเหนือจากการใช้สตริงการเชื่อมต่อที่เข้ารหัสแล้วการใช้ LDAP / Kerberos / Active Directory จะเป็นตัวเลือกที่ปลอดภัยที่สุดของคุณ


3

หากรหัสผ่านของคุณถูกเก็บไว้ในรูปแบบข้อความธรรมดาให้ใช้แฮช (MD5, SHA) ลุค!


OP ไม่ได้ถามเกี่ยวกับการจัดเก็บรหัสผ่านของผู้ใช้ แต่ใช่แฮชรหัสผ่านผู้ใช้ของคุณแน่นอน แต่ไม่เคยใช้ MD5 หรือตระกูล SHA ที่จะทำ! ใช้bcryptหรือ PBKDF2 มิฉะนั้นคุณจะพบว่าตัวเองอยู่ในข่าวเช่น บริษัท ที่ใช้ MD5 และ SHA1 ในไม่ช้าและทำให้ผู้ใช้ของพวกเขาต้องเผชิญกับการโจมตีที่ดุร้ายอย่างง่าย
Nick Chammas

แน่นอนว่าต้องใช้ความเค็มและเทคนิคอื่น ๆ นอกเหนือจากเพียงแค่คร่ำเครียด และไม่ควรใช้การเข้ารหัสแบบดั้งเดิมของตัวเอง (ตัวเอง) แต่ควรใช้ไลบรารีการเข้ารหัสลับที่ผ่านการทดสอบอย่างกว้างขวาง
Yasir Arsanukaev

2

ขึ้นอยู่กับภาษาการเขียนโปรแกรมของคุณคุณสามารถเข้ารหัสข้อมูลรับรองการเข้าสู่ระบบ แต่ถ้าคุณกำลังใช้ภาษาที่ตีความแล้วก็ไม่มีวิธีที่จะทำให้มั่นใจได้ว่ามีใครบางคนไม่สามารถตรวจสอบข้อมูลประจำตัวหากพวกเขาเข้าถึงระบบ

หากคุณใช้ C ++ หรือสิ่งที่คล้ายกันฉันขอแนะนำให้คุณสร้าง / ค้นหาฟังก์ชั่นการเข้ารหัส / ถอดรหัสเค็มและเรียกใช้ข้อมูลประจำตัวผ่านทางนั้นและเก็บแฮชผลลัพธ์เป็นไฟล์ในระบบ

หากคุณใช้ PHP หรือสิ่งที่คล้ายกันฉันขอแนะนำให้คุณเขียน wrapper สำหรับmcrypt_encrypt()และใส่ข้อมูลประจำตัวจากนั้นเรียกใช้โค้ดที่ทำให้งงงวยเพื่อทำให้แฮกเกอร์ช้าลงหากพวกเขาเข้าถึงระบบได้


หากคุณเข้ารหัสข้อมูลประจำตัวคุณต้องมีความลับอื่น ๆ เพื่อถอดรหัสอีกครั้ง หรืออีกวิธีหนึ่งรูปแบบที่เข้ารหัสกลายเป็นความลับเพื่อให้ผู้โจมตีสามารถใช้งานได้ รายละเอียดบางอย่างหายไป
Peter Eisentraut
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.