ทำไมรหัสผ่านควรถูกเข้ารหัสหากมีการจัดเก็บในฐานข้อมูลที่ปลอดภัย


78

ฉันมีบริการเว็บ ตอนนี้ฉันมีรหัสผ่านที่เก็บเป็นข้อความธรรมดาในตารางMySQLบนเซิร์ฟเวอร์ของฉัน ฉันรู้ว่านี่ไม่ใช่วิธีปฏิบัติที่ดีที่สุดและนั่นคือสาเหตุที่ฉันกำลังทำอยู่

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

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

หากรหัสผ่านถูกเข้ารหัสคุณสามารถคืนค่าฐานข้อมูลก่อนหน้าได้ นี่เป็นความคิดที่ถูกต้องหรือไม่


124
ฉันจะไปอีกขั้นหนึ่ง การเข้ารหัสนั้นไม่เพียงพอ คุณต้องการแฮช ด้วยวิธีดังกล่าวคุณไม่ควรรู้รหัสผ่านที่เป็นข้อความธรรมดาของผู้ใช้
Santa

67
@Santa Hashing รหัสผ่านไม่เพียงพอ คุณต้องเพิ่มเกลือบางอย่างเพื่อให้สูตรดีพอ ...
บาคุริ

16
โปรดดูที่การรักษาความปลอดภัยที่เกี่ยวข้องโพสต์แลกเปลี่ยน: วิธีแฮรหัสผ่านที่ปลอดภัย?
Adi

10
DBA ไม่พอใจบอกว่า ... เลือก * จากผู้ใช้จากนั้นขายรายการดังกล่าวสำหรับการจ่ายเงินชดเชย ไม่มีอะไรปลอดภัย
Jon Raynor

คำตอบ:


194

ก่อนอื่นคุณควรมีอิสระในการเข้าถึงแบบอ่านอย่างเดียวมากกว่าอ่าน - เขียน อาจเป็นไปได้ว่าแฮ็กเกอร์สามารถเข้าถึงข้อมูลของคุณ แต่ไม่สามารถแก้ไขได้

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

หากคุณกู้คืนฐานข้อมูลของคุณแฮ็กเกอร์ยังคงสามารถเข้าถึงบัญชีผู้ใช้ของคุณได้

แล้วใครจะรู้อีกล่ะ ถ้าพวกเขาใช้รหัสผ่านเดียวกันกับ Google ล่ะ หรือ PayPal ถ้าเป็นเช่นนั้นจะทำให้แฮ็กเกอร์เข้าถึงชื่อหญิงสาวของแม่หรือหมายเลข 4 หลักสุดท้ายของบัตรเครดิต

เกิดอะไรขึ้นถ้านั่นทำให้พวกเขาเข้าสู่บัญชีอื่น ๆ อย่าใส่มันผ่านแฮกเกอร์ไปผ่านระบบสนับสนุนผู้ใช้และได้รับข้อมูลเพิ่มเติม

แค่ ... แค่ทำไม่ได้ นั่นคือข้อมูลส่วนตัวของผู้ใช้และคุณไม่จำเป็นต้องสามารถดูได้ นอกจากนี้ยังเป็นชื่อเสียงของคุณ เข้ารหัสมัน

แก้ไข: หนึ่งความคิดเห็นพิเศษเพื่อบันทึกผู้อ่านในอนาคตจากการอ่านทุกคำตอบและแสดงความคิดเห็น ...

หากคุณกำลังเข้ารหัส (ในความหมายที่เข้มงวดที่สุด) คุณต้องใช้คู่คีย์สาธารณะ / ส่วนตัวซึ่งใช้ได้ แต่ทำให้ชีวิตยากขึ้นเล็กน้อยสำหรับคุณและผู้ใช้ของคุณ

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


89
หรือดีกว่าแฮชมัน!
Blorgbeard

29
นี้. "ฉันมีปัญหาอื่น ๆ ถ้ามีคนเข้ามาในฐานข้อมูลของฉัน" เป็นฐานข้อมูลของคุณคุณคาดว่าจะมีปัญหาหากถูกแฮ็ก แต่ด้วยการจัดเก็บรหัสผ่านแบบธรรมดาคุณทำให้ผู้ใช้ทุกคนมีปัญหากับบัญชีอื่นทั้งหมดของพวกเขา คุณคิดว่ามีกี่คนที่ใช้รหัสผ่านที่แตกต่างกันในทุก ๆ เว็บไซต์
Carson63000

13
โปรดปฏิบัติตามคำแนะนำของ Blorgbeard อาจจะอ่านนี้ การเข้ารหัสรหัสผ่านไม่ได้ให้การป้องกันเมื่อเว็บเซิร์ฟเวอร์ของคุณถูกบุกรุก กุญแจสำคัญในการถอดรหัสรหัสผ่านจะต้องเก็บไว้ที่ใดที่หนึ่งบนเซิร์ฟเวอร์ การใส่รหัสผ่านหมายความว่าแม้ในกรณีที่บางคนสามารถเข้าถึงเครื่องได้อย่างสมบูรณ์ แต่ก็ไม่สามารถกู้คืนรหัสผ่านได้อย่างง่ายดาย
slicedpan

7
เหตุใดคุณจึงต้องเข้ารหัสรหัสผ่านหากไม่มีค่าในระบบของคุณ คุณจะต้องถอดรหัสรหัสผ่านในเวลาใดนอกจากการเปรียบเทียบ @pdr คุณไม่ควรบอกให้ OP เข้ารหัสคุณควรจะบอกเขาถึงเกลือและแฮช
NobleUplift

4
คุณต้องการแฮชคำตอบสำหรับคำถามการกู้คืนรหัสผ่าน ไม่เช่นนั้นสามารถใช้เพื่อเข้าสู่ไซต์อื่นได้เช่นเดียวกับรหัสผ่าน
Zan Lynx

64

หากคุณถูกแฮ็กคุณสามารถกู้คืนไซต์จากการสำรองข้อมูลและแก้ไขได้ แต่แฮ็กเกอร์ยังมีรหัสผ่านสำหรับบัญชีของทุกคน! มีตัวอย่างเอกสารจริงของเหตุการณ์นี้ (Sony, Linked-in) ซึ่งหากตารางรหัสผ่านได้รับการแฮชและใส่เกลืออย่างถูกต้องการรักษาความปลอดภัยและการคืนค่าบริการอย่างรวดเร็วจะง่ายกว่ามาก

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

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

รหัสผ่านที่แฮชและเค็มอย่างเหมาะสมนั้นเป็นแบบทางเดียว คุณไม่สามารถเดารหัสผ่านจากรหัสผ่านที่แฮชได้อย่างง่ายดาย แม้ว่าคุณจะเป็นผู้ให้บริการที่คาดเดาไม่ได้ แต่คุณสามารถรีเซ็ตได้เท่านั้น

ดังที่ Elin กล่าวว่าอย่าพยายามม้วนการแปลงของคุณเอง (หรือการเข้ารหัส) ใช้ไลบรารีมาตรฐาน



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

2
การเขียน foreach เพื่อวนลูปรายชื่อผู้ใช้และจากนั้นแฮรหัสผ่านของพวกเขาคือการทำงานของไม่กี่นาทีและ 4000 จริง ๆ แล้วแทบจะไม่มีอะไร php.net/manual/en/function.hash.php
Elin

3
คุณสลับไปมาระหว่างคำว่า "เข้ารหัส" กับ "แฮชและเกลือ" @ david25272 อย่าสับสนทั้งสองซึ่งแตกต่างอย่างสิ้นเชิง ตอนนี้ OP กำลังมองหาอัลกอริธึมการเข้ารหัสไม่ใช่อัลกอริทึมแฮช นอกจากนี้ยังเป็น "เกลือและกัญชา" ไม่ใช่ "กัญชาและเกลือ" คุณไม่สามารถเค็มได้หลังจากแฮช
NobleUplift

1
ยัง @phpmysqlguy อ่านคำตอบของฉันสำหรับคำแนะนำเกี่ยวกับขั้นตอนวิธีการเติมเกลือและแฮช
NobleUplift

36

แต่ฉันมีปัญหาอื่น ๆ ถ้ามีคนเข้ามาในฐานข้อมูลของฉันนั่นคือการลบข้อมูล

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

เห็นแม้คนควรใช้รหัสผ่านที่แตกต่างกันในระบบที่แตกต่างกันในความเป็นจริงก็คือว่าทำไม่ได้

... และเนื่องจากเป็นเรื่องง่ายที่จะแฮรหัสผ่านคุณจึงไม่มีข้อแก้ตัวใด ๆ ที่จะไม่ปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดในอุตสาหกรรม


9
คุณทำให้สิ่งที่ฉันเชื่อว่าเป็นจุดสำคัญที่สุด: คุณและคนงานของคุณไม่ควรเข้าถึงรหัสผ่านของผู้ใช้ ใครเป็นห่วงแฮ็กเกอร์มันคือคนที่เก็บข้อมูลที่เกี่ยวข้องกับผู้ใช้
Adam Davis

1
+1 เนื่องจากข้อเท็จจริงว่าในฐานะนักพัฒนา / ผู้ดูแลระบบคุณไม่ควรเข้าถึงรหัสผ่านของผู้ใช้ นั่นคือเหตุผลในตัวมันเองนั่นเอง
Matt

21

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

นอกจากนี้ยังมีการประนีประนอมไม่ให้เปลือกเต็มรูปแบบ ถ้าช่องโหว่ที่ผู้โจมตีใช้เป็นเพียงการฉีด SQL แบบอ่านอย่างเดียวบนusersโต๊ะ การปล่อยรหัสผ่านที่ไม่มีการแฮชเพียงให้เขาเข้าถึงได้อย่างเต็มที่

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


18

ฉันต้องโพสต์คำตอบที่นี่ในการเข้าใจผิดในคำถามตัวเอง คุณกำลังถามว่าควรเข้ารหัสรหัสผ่านหรือไม่ ไม่มีใครเข้ารหัสรหัสผ่าน; ไม่มีใครยกเว้นบริการและโปรแกรมเช่น Firefox Sync และ Roboform ซึ่งมีวัตถุประสงค์เพียงอย่างเดียวคือการเข้ารหัสรหัสผ่าน

ลองมาดูคำจำกัดความ:

ในการเข้ารหัสการเข้ารหัสเป็นกระบวนการเข้ารหัสข้อความ (หรือข้อมูล) ในลักษณะที่ผู้ที่ได้รับอนุญาตเท่านั้นที่สามารถอ่านได้

และคร่ำเครียด:

ฟังก์ชันแฮชคืออัลกอริทึมใด ๆ ที่แมปข้อมูลความยาวโดยพลการกับข้อมูลของความยาวคงที่

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

นอกจากนี้ยังทำไม่ได้กัญชาเพียงเกลือ ! อ่านทั้งหน้าก่อนที่จะแฮรหัสผ่านของคุณ

สำหรับอัลกอริทึมการแฮชซึ่งตอนนี้ OP กำลังตรวจสอบอยู่ฉันจะแนะนำ SHA-2 varients ระดับสูงเช่น SHA-384 หรือ SHA-512

และทำให้แน่ใจว่าจะใช้รอบของคร่ำเครียด อย่าแฮชหนึ่งครั้งแล้วแฮชหลายครั้ง

ลองอ่านหน้านี้เพื่อเพิ่มความปลอดภัยให้กระบวนการล็อกอินของคุณมากขึ้น

ประการที่สองฐานข้อมูลของคุณจะไม่ปลอดภัยพอ จะมีช่องโหว่ด้านความปลอดภัยและความเสี่ยงที่เปลี่ยนแปลงอยู่เสมอ คุณควรปฏิบัติตามกฎของ Murphy และเตรียมพร้อมสำหรับเหตุการณ์ที่เลวร้ายที่สุดเสมอ

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


+1 สำหรับแฮชบวกเกลือ แคร็ก hashes โดยไม่ต้องเป็นเกลือsoooง่าย
รหัสไม่ฝักใฝ่ฝ่ายใด

3
คุณรู้ว่ามีอะไรอยู่อีกด้านหนึ่งของตารางสายรุ้ง @CodeMaverick? หม้อทองคำ
NobleUplift

ในบริบทของการแฮ็กรหัสผ่าน MD5 นั้นไม่มีช่องโหว่ใด ๆ ที่รู้ตัวว่ารวดเร็วกว่าและใช้กับ SHA-2 ได้เช่นกัน ใช้ช้าก่อสร้างซ้ำเป็นไกลมีความสำคัญมากกว่าการเลือก SHA-2 มากกว่า MD5
CodesInChaos

4
"อ่านทั้งหน้าก่อนที่จะแฮรหัสผ่านของคุณ" - หน้านั้นระบุว่าคุณไม่ควรใช้รอบของการแฮช แต่เป็นวิธีการแฮชที่ได้รับการออกแบบมาโดยเฉพาะให้ช้าเท่าที่จำเป็นเช่น PBKDF2
jhominal

2
ใช้ SCrypt หรือ PBKDF2 ซึ่งทั้งคู่ได้รับการออกแบบให้มีราคาแพงมากในการดำเนินการทั้งในแง่ของหน่วยความจำหรือ CPU ใช้เกลือที่สร้างขึ้นแบบสุ่มที่คุณเก็บไว้ในบันทึกของผู้ใช้ อย่าทำการแฮชหลายรอบซึ่งจะนำไปสู่ปัญหาการชนกัน
tom.dietrich

14

มีหลักการสำคัญในการเดิมพันที่นี่ มีเพียงคนเดียวเท่านั้นที่มีธุรกิจใด ๆ ที่รู้รหัสผ่านผู้ใช้ นั่นคือผู้ใช้ ไม่ใช่ภรรยา / สามีแพทย์หรือแม้แต่นักบวช

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

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

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

วิธีแก้ปัญหาที่พบบ่อยคือ:

ณ จุดที่ได้รับรหัสผ่านครั้งแรกในแอปพลิเคชันรหัสผ่านจะถูกส่งไปยังฟังก์ชันการแฮชพร้อมกับค่า 'เกลือ' ของแอปพลิเคชันที่คุณสุ่มลงในฟังก์ชันแฮช

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

ประเด็นสำคัญที่ให้ความปลอดภัยที่นี่คือ:

  1. ความรู้เกี่ยวกับแฮชไม่ได้ให้การรับรองความถูกต้องโดยตรง
  2. การคำนวณรหัสผ่านย้อนกลับจากแฮชไม่สามารถทำได้
  3. การใช้ตารางสายรุ้ง (รายการรหัสผ่านที่ยาวและแฮชที่คำนวณได้) นั้นมีความท้าทายมากขึ้นเนื่องจากแฮชที่ได้นั้นขึ้นอยู่กับชื่อผู้ใช้และรหัสผ่าน

6
โดยทั่วไปแล้วเราต้องการใช้เกลือแบบสุ่มแทนชื่อผู้ใช้
CodesInChaos

ว้าวจับได้ดี @CodesInChaos ฉันไม่ได้สังเกตว่าในการอ่านครั้งแรกของคำถาม ใช่เกลือของคุณควรจะสร้างแบบสุ่ม ไม่จำเป็นต้องเป็น blob บ้า ๆ ที่เก็บไว้ใน MySQL (และนั่นจะไม่ดีเพราะมันจะไม่สามารถพกพาได้) มิฉะนั้น +1 จะบอกว่ามีเพียงผู้ใช้เท่านั้นที่ควรรู้รหัสผ่านของผู้ใช้
NobleUplift

ตกลงคำตอบที่ปรับปรุงแล้วเพื่อแนะนำแอปพลิเคชันมีค่าเกลือแบบสุ่มของตัวเอง
Michael Shaw

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

ไม่ใช่บริการบนเว็บ แต่การรับรองความถูกต้องของ SSH keypair ใช้วิธี 'บริสุทธิ์' ซึ่งเซิร์ฟเวอร์เก็บรหัสสาธารณะและผู้ใช้รับรองความถูกต้องด้วยรหัสส่วนตัว
cpast

10

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

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


+1 สำหรับการทราบถึงความแตกต่างระหว่างการเข้ารหัสและการแฮช
NobleUplift

8

ฉันจะไม่ทำซ้ำสิ่งที่คนอื่นพูด แต่ถ้าคุณมีPHP 5.3.8 หรือดีกว่าคุณควรใช้ PHP พื้นเมืองbcryptเพื่อเก็บรหัสผ่านของคุณ สิ่งนี้สร้างขึ้นใน PHP หากคุณมี PHP 5.5 คุณสามารถใช้ค่าคงที่ของรหัสผ่านที่ดีที่สุดได้ คุณสามารถใช้ไลบรารีเพื่อให้ 5.3.8 หรือทำงานที่ดีขึ้นเช่น 5.5

คำถาม Stack Overflow คุณใช้ bcrypt สำหรับแฮ็ชพาสเวิร์ดใน PHP ได้อย่างไร? อธิบายได้และคำตอบอื่น ๆ จะอธิบายเพิ่มเติม โปรดอย่าสับสนกับการพยายามทำสิ่งนี้ด้วยตัวเอง


2
น่าเสียดายที่ฉันใช้ PHP 5.3.3 ดังนั้นคำแนะนำของคุณจะไม่ถูกนำมาใช้
phpmysqlguy

4
5.3.3 ถึง 5.3.8 ของการอัพเกรดมาก?
gbjbaanb

โอกาสใดก็ตามที่คุณอยู่ใน Red Hat? เนื่องจากพวกเขาได้ทำการแก้ไขการ bcrypt ถ้าไม่ใช่ให้ใช้ SHA256 แทน brcypt
Elin

1
การเข้ารหัสและการแฮชเป็นสิ่งที่แตกต่างกัน รหัสผ่านแฮอย่าเข้ารหัส คุณไม่จำเป็นต้องรู้จักพวกเขา คุณต้องการให้ผู้ใช้สามารถใช้รหัสผ่านเพื่อพิสูจน์ว่าเขา / เธอเป็นใคร Hashing (พร้อมเกลือ) ช่วยให้นี้ การเข้ารหัสลับ การเข้ารหัสแบบสมมาตรนั้นผิดเนื่องจากอนุญาตให้กู้คืนรหัสผ่านได้
Paul de Vrieze

สิ่งหนึ่งที่ฉันจะเพิ่มก็คือสิ่งที่ดีเกี่ยวกับฟังก์ชั่น password_hash () ใน php 5.5+ ก็คือมันจัดการกับเกลือและอื่น ๆ ตามค่าเริ่มต้น ก่อนหน้านี้คุณต้องดำเนินการต่อไปและใช้บางอย่างเช่นไลบรารีของ ircmaxell ที่ backport มัน (เขาเขียนการใช้งาน 5.5) อย่าคิดว่าคุณสามารถสร้างเกลือแบบสุ่มได้ด้วยตัวเอง มันยากมากและดีที่สุดสำหรับผู้เชี่ยวชาญ มันง่ายมากที่จะได้รับผลการสุ่ม แต่ไม่เหมือนกันซึ่งเป็นการเอาเปรียบ
Elin

7

ฉันเห็นด้วยกับคำตอบจาก pdr ด้วยเหตุผลที่ระบุไว้ในคำตอบนั้น

ฉันจะเพิ่มสิ่งต่อไปนี้: คุณควรทำเพราะเป็นเรื่องง่ายที่จะทำและยอมรับโดยทั่วไปว่าเป็นแนวปฏิบัติที่ดีที่สุดสำหรับแอปพลิเคชันใด ๆ โดยเฉพาะอย่างยิ่งควรใส่รหัสผ่านและแฮชก่อนที่จะเขียนลงในที่เก็บข้อมูลถาวร นี่คือการอ้างอิงที่ดีเกี่ยวกับความสำคัญของการเติมเกลือและการเลือกแฮชการเข้ารหัสลับที่ดี (ซึ่งยังมีซอร์สโค้ดฟรีในภาษายอดนิยมหลายภาษา): https://crackstation.net/hashing-security.htm

เวลาในการพัฒนาเพิ่มเติมเพียงเล็กน้อยนั้นคุ้มค่ากับการปกป้องที่ให้แก่ผู้ใช้ของคุณและต่อชื่อเสียงของคุณในฐานะนักพัฒนา


+1 สำหรับการกล่าวถึงทั้งการเค็มและการแฮชรวมถึงการไม่พูดถึงการเข้ารหัสซึ่งไม่ได้อยู่ในคำถามนี้
NobleUplift

2

สถานการณ์ที่ฉันคิดได้ก็คือคุณถูกแฮ็ก

อีกสถานการณ์ที่คุณต้องนึกถึง: มีคนเลื่อน DBA ของคุณ (หรือใครก็ตามที่สามารถเรียกใช้คิวรีแบบเลือกบนฐานข้อมูลของคุณ) $ 100 เพื่อให้พวกเขามีรหัสผ่านของผู้ใช้ หรือวิศวกรสังคมสงเคราะห์บางส่วนที่จะทำเช่นนั้น

จากนั้นพวกเขาใช้รหัสผ่านเหล่านั้นเพื่อเข้าสู่ Gmail ของผู้ใช้ ... หรือเว็บไซต์การค้า ... (เพราะคนเรา ... น้อยกว่าสมาร์ทเราจะพูด - และใช้รหัสผ่านเดียวกันทั่วทั้งไซต์)

จากนั้นผู้ใช้ที่โกรธแค้นก็ฟ้อง บริษัท ของคุณเพื่อเปิดเผยรหัสผ่าน


NOBODY (รวมถึงบุคคลใน บริษัท ของคุณ) ควรจะสามารถอ่านรหัสผ่านแบบข้อความธรรมดาได้ เคย ไม่มีความต้องการทางธุรกิจหรือทางเทคนิคที่ถูกกฎหมาย


2

หนึ่งแม้แต่ผู้ดูแลระบบฐานข้อมูลไม่ควรเห็นรหัสผ่านของผู้ใช้ การแฮชที่พวกเขาจะป้องกันไม่ให้ในกรณีที่ผู้ดูแลระบบตัดสินใจที่จะดูรหัสผ่านและเข้าสู่บัญชีผู้ใช้ของพวกเขา


1
นี้ไม่ได้เพิ่มอะไรที่คุ้มค่ากับสิ่งที่ถูกโพสต์ไว้แล้วในคำตอบก่อน
ริ้น

3
+1 จริงๆแล้วเขาพูดว่า "คร่ำเครียด" แทนที่จะเข้ารหัสเหมือนคนอื่น ๆ นอกจากนี้เขายังขัดแย้งกับ OP โดยตรงซึ่งกล่าวว่าเขาต้องการรหัสผ่านให้ลงชื่อเข้าใช้บัญชีผู้ใช้รายอื่น
NobleUplift

0

มันน่าแปลกใจที่ไม่มีใครพูดถึงเรื่องนี้ แต่สิ่งที่เกี่ยวกับความปลอดภัยทางกายภาพของฐานข้อมูลของคุณ?

คุณอาจมีการตั้งค่าความปลอดภัยด้านไอทีที่ดีที่สุดในโลก แต่นั่นไม่ได้หยุดใครก็ตามที่สามารถเข้าถึงสื่อเก็บข้อมูลของคุณได้ จะเกิดอะไรขึ้นเมื่อทีมของคุณชนะ Superbowl ในบ่ายวันนี้และการจลาจลเล็กน้อยเกิดขึ้นในเขตตัวเมืองของคุณซึ่งเป็นที่ตั้งสำนักงาน / ผู้ให้บริการโฮสติ้งของคุณ (เนื่องจากว่าเป็น Seattle กับ Denver ซึ่งเป็นพื้นที่ไอทีขนาดใหญ่สองแห่งในสหรัฐอเมริกาฉันไม่คิดว่ามันไม่มีเหตุผล) ฝูงชนชนตึกของคุณและในขณะที่เจ้าหน้าที่ถูกครอบงำใครบางคนคว้าฮาร์ดแวร์ของคุณด้วยฐานข้อมูลที่มีรหัสผ่านข้อความที่ชัดเจน?

จะเกิดอะไรขึ้นเมื่อเฟดปรากฏตัวและยึดอุปกรณ์ของคุณเพราะผู้บริหารระดับสูงบางคนกำลังใช้ตำแหน่งของเขาใน บริษัท เพื่อทำการซื้อขายหุ้นที่ผิดกฎหมาย จากนั้น Feds จะใช้รหัสผ่านเหล่านั้นเพื่อตรวจสอบลูกค้าของคุณ จากนั้นพวกเขาก็ตระหนักว่าเป็นคุณที่ทำให้พวกเขาอ่อนแอ

จะเกิดอะไรขึ้นเมื่อแผนกไอทีของคุณลืมที่จะล้างข้อมูลไดรฟ์ RAID เก่าที่เก็บฐานข้อมูลของคุณเมื่อพวกเขาทำการเปลี่ยนกำหนดการก่อน "แจก" ไดรฟ์เก่าแก่ฝึกงานและจากนั้นเพื่อนร่วมห้องในหอพักของพวกเขาจะพบสิ่งที่ถูกทิ้งไว้ ขาย "มันและไม่เคยมีมันย้อนกลับไปหาพวกเขา?

จะเกิดอะไรขึ้นเมื่อ DB Server ของคุณเมนบอร์ดระเบิดไอทีคืนภาพไปยังเซิร์ฟเวอร์ใหม่ของคุณและ "ซาก" ของเซิร์ฟเวอร์เก่าจะถูกโยนทิ้งในกองรีไซเคิล? ไดรฟ์เหล่านั้นยังคงดีและข้อมูลนั้นยังอยู่ที่นั่น

สถาปนิกที่ดีทุกคนรู้ว่าความปลอดภัยไม่ใช่สิ่งที่คุณ "เปิดใช้" ในภายหลังด้วยไฟร์วอลล์และนโยบายการดำเนินงาน การรักษาความปลอดภัยจะต้องเป็นส่วนพื้นฐานของการออกแบบตั้งแต่เริ่มต้นและนั่นหมายความว่ารหัสผ่านถูกแฮชแบบทางเดียวไม่เคยส่งด้วยการเข้ารหัสออก (แม้แต่ภายในศูนย์ข้อมูลของคุณ) และไม่สามารถกู้คืนได้ สิ่งใดก็ตามที่สามารถดึงข้อมูลได้สามารถถูกบุกรุกได้


-1

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


1
จริงๆแล้วถ้า OP เอาไปอีกขั้นหนึ่งแล้วเข้ารหัสใน JavaScript แล้วแฮชจะถูกส่งผ่านสายและไม่เคยเห็นในคำขอ
NobleUplift

1
ในกรณีนั้นผู้โจมตีจะต้องส่งแฮชข้ามเส้นลวดด้วย แฮชจะทำหน้าที่เป็นรหัสผ่านแฟนซี แต่ไม่มีการเข้ารหัสใช่มั้ย (แก้ไข: ไม่ใช่ถ้ามันจะต้องใส่เกลือด้วยเกลือที่แตกต่างกันในแต่ละครั้งและเกลือมาจากเซิร์ฟเวอร์ฉันคิดว่า)
RemcoGerlich

1
@RemcoGerlich แนวคิดที่สำคัญเป็นที่รู้จักกันขณะปัจจุบันที่ใช้ในการหลีกเลี่ยงการโจมตี replay

-1

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

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

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


2
ใครเป็นผู้เก็บรหัสผ่านโดยใช้การเข้ารหัสแบบอสมมาตร นั่นคือการเข้ารหัสแบบพับลิกคีย์ซึ่งหมายความว่าแม้หลังจากที่ฉันเข้ารหัสรหัสผ่านแล้วก็สามารถถอดรหัสและอ่านได้ถ้ามีใครเคยได้รับรหัสส่วนตัวของฉัน เมื่อมีการแฮ็กฉันและฉันเท่านั้นที่รู้รหัสผ่านของฉัน (เว้นแต่ฉันจะจดไว้หรือใส่ไว้ในเครื่องมือจัดการรหัสผ่าน
NobleUplift

โปรดตรวจสอบหน้าวิกิพีเดียสำหรับการเข้ารหัสคีย์สาธารณะ: en.wikipedia.org/wiki/Public-key_cryptography "การเข้ารหัสคีย์สาธารณะซึ่งรู้จักกันในชื่อการเข้ารหัสแบบไม่สมมาตร"
Alpha1983

2
... ใช่ฉันพูดusing asymmetric encryption? That's public-key cryptographyอย่างนั้น ประเด็นของคุณคืออะไร?
NobleUplift

-1

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

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


1
สิ่งนี้ดูเหมือนจะไม่เสนออะไรมากไปกว่าคำตอบก่อนหน้า 14 ข้อ
ริ้น

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

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

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

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