SHA1 vs md5 vs SHA256: จะใช้เข้าสู่ระบบ PHP อย่างไร


133

ฉันกำลังทำการล็อกอิน php และฉันกำลังพยายามตัดสินใจว่าจะใช้ SHA1 หรือ Md5 หรือ SHA256 ที่ฉันอ่านในบทความ stackoverflow อื่น มีความปลอดภัยมากกว่าคนอื่น ๆ หรือไม่? สำหรับ SHA1 / 256 ฉันยังใช้เกลืออยู่หรือไม่?

นอกจากนี้วิธีนี้เป็นวิธีที่ปลอดภัยในการจัดเก็บรหัสผ่านเป็นแฮชใน mysql หรือไม่?

function createSalt()
{
    $string = md5(uniqid(rand(), true));
    return substr($string, 0, 3);
}

$salt = createSalt();

$hash = sha1($salt . $hash);


ดูคำตอบนี้และอ่านหัวข้อเกี่ยวกับการแฮชรหัสผ่าน
Ja͢ck

คำตอบ:


110

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

ใช้ bcrypt ใน PHP 5.5+

PHP 5.5 ข้อเสนอฟังก์ชั่นใหม่สำหรับ hashing นี่คือแนวทางที่แนะนำสำหรับการจัดเก็บรหัสผ่านในเว็บแอปพลิเคชันสมัยใหม่

// Creating a hash
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
// If you omit the ['cost' => 12] part, it will default to 10

// Verifying the password against the stored hash  
if (password_verify($password, $hash)) {
    // Success! Log the user in here.
}

หากคุณใช้ PHP เวอร์ชันเก่าคุณควรอัปเกรดจริงๆแต่คุณสามารถใช้password_compatเพื่อเปิดเผย API นี้ได้จนกว่าคุณจะทำได้

นอกจากนี้โปรดpassword_hash()สร้างเกลือให้คุณด้วย มันใช้CSPRNG

สองคำเตือนของ bcrypt

  1. Bcrypt จะตัดรหัสผ่านที่มีความยาวเกิน 72 อักขระ
  2. Bcrypt จะตัดหลังจากNULอักขระใด ๆ

( หลักฐานแนวคิดสำหรับคำเตือนทั้งสองที่นี่)

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

แทนที่จะเขียนโครงร่างของคุณเองให้ใช้ไลบรารีที่มีอยู่ซึ่งเขียนและ / หรือประเมินโดยผู้เชี่ยวชาญด้านความปลอดภัย

  • Zend\Crypt (ส่วนหนึ่งของ Zend Framework) เสนอ BcryptSha
  • PasswordLockคล้ายกับBcryptShaแต่ก็ยังเข้ารหัส hashes bcrypt กับห้องสมุดการเข้ารหัสรับรองความถูกต้อง

TL; DR - ใช้ bcrypt


1
นอกจากนี้ฉันยังใหม่มากสำหรับสิ่งนี้: sha1, sha256 และ md5 'แฮช' ทั้งหมดที่คุณอ้างถึงหรือไม่
Tony Stark

3
ใช่. ฉันหมายถึง SHA1, SHA256 และ MD5 และชุดของแฮชอื่น ๆ ที่ปรับให้เหมาะกับความเร็ว คุณไม่ต้องการใช้แฮชที่ปรับให้เหมาะสมกับความเร็วเพื่อรักษารหัสผ่าน มีบทความดีๆมากมายที่พูดถึงสาเหตุและฉันชอบบทความนี้เป็นพิเศษ: chargen.matasano.com/chargen/2007/9/7/…
Johannes Gorset

4
ซึ่งรวมอยู่ในฟังก์ชัน "crypt" ตั้งแต่ PHP 5.3 หากคุณมีเวอร์ชันก่อนหน้าฉันจะตรวจสอบกรอบ "phpass" สำหรับสิ่งที่ดีที่สุดถัดไป
Johannes Gorset

3
@Stanislav Palatnik SHA512 เป็นทางเลือกที่ดี อย่าเข้าใจฉันผิด; ฉันไม่ได้บอกว่าแฮช SHA512 ที่ยืดและเค็มนั้นไม่ปลอดภัย มันปลอดภัย ถึงอย่างนั้นความจริงก็ยังคงอยู่ว่า bcrypt มีความปลอดภัยมากกว่าดังนั้นฉันจึงไม่เห็นเหตุผลที่จะไม่ใช้มัน
Johannes Gorset

10
@ ไซเฟอร์: bcryptถูกออกแบบมาให้ช้าเพื่อให้เกิดการแตกช้าเท่า ๆ กัน
Johannes Gorset

23

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

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

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

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

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

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

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

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


1
ระบุไว้อย่างดี Cyber ​​Security จะเป็นที่ต้องการมากกว่าเทคนิคการแฮชซึ่งไม่เพียง แต่บันทึกข้อมูลของคุณเท่านั้น แต่ยังช่วยให้การป้องกันเซิร์ฟเวอร์พร้อม
CᴴᴀZ

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

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

6
"หากฐานข้อมูลของคุณถูกบุกรุกส่วนใหญ่แล้วทุกอย่างจะถูกบุกรุกรวมถึงเทคนิคการแฮชของคุณไม่ว่าคุณจะทำมันไว้เป็นความลับก็ตาม" นั่นเป็นเหตุผลว่าทำไม bcrypt จึงมีความสำคัญ ด้วย bcrypt ไม่สำคัญว่าจะมีใครมีแฮชหรือไม่ ด้วยอัลกอริธึมการแฮชที่รวดเร็วเช่น SHA1 / MD5 จึงทำได้
ceejayoz

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

15

ขณะที่โยฮันเน Gorset ชี้ให้เห็นโพสต์โดยโทมัส Ptacek จาก Matasano การรักษาความปลอดภัยอธิบายว่าทำไมง่ายวัตถุประสงค์ทั่วไปฟังก์ชั่นคร่ำเครียดเช่น MD5, SHA1, SHA256 และ SHA512 เป็นตัวเลือกที่น่าสงสารรหัสผ่านคร่ำเครียด

ทำไม? มันเร็วเกินไป - คุณสามารถคำนวณ MD5 ได้อย่างน้อย 1,000,000 แฮชต่อวินาทีต่อคอร์ด้วยคอมพิวเตอร์สมัยใหม่ดังนั้นการบังคับอย่างดุร้ายจึงเป็นไปได้เมื่อเทียบกับรหัสผ่านส่วนใหญ่ที่ผู้คนใช้ และนั่นน้อยกว่าคลัสเตอร์เซิร์ฟเวอร์แคร็กที่ใช้ GPU มาก!

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

ผู้ใช้ @ จะพูดว่า:

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

พวกเขาไม่จำเป็นต้อง เห็นได้ชัดว่าในกรณีของ LinkedInพวกเขาใช้ช่องโหว่การแทรก SQLทั่วไปเพื่อรับตาราง DB สำหรับเข้าสู่ระบบและถอดรหัสรหัสผ่านนับล้านแบบออฟไลน์

จากนั้นเขาก็กลับไปที่สถานการณ์การโจมตีออฟไลน์:

ความปลอดภัยเข้ามามีบทบาทจริงๆเมื่อฐานข้อมูลทั้งหมดถูกบุกรุกและแฮ็กเกอร์สามารถพยายามใช้รหัสผ่าน 100 ล้านครั้งต่อวินาทีกับแฮช md5 SHA512 ช้ากว่าประมาณ 10,000 เท่า

ไม่SHA512ไม่ช้ากว่า MD5 ถึง 10,000 เท่า - ใช้เวลาเพียงสองเท่า ในทางกลับกัน Crypt / SHA512 เป็นสัตว์ร้ายที่แตกต่างกันมากเช่นเดียวกับ BCrypt ที่เป็นคู่ของมันทำการยืดคีย์สร้างแฮชที่แตกต่างกันมากโดยมีเกลือแบบสุ่มในตัวและจะใช้เวลาระหว่าง 500 ถึง 999999 เท่าในการคำนวณ (สามารถปรับการยืดได้)

SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

ดังนั้นตัวเลือกสำหรับ PHP คือ Crypt / Blowfish (BCrypt), Crypt / SHA256 หรือ Crypt / SHA512 หรืออย่างน้อย Crypt / MD5 (PHK) ดูwww.php.net/manual/en/function.crypt.php


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

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

หากข้อกำหนดด้านความปลอดภัยนั้นรุนแรงมากการจัดเก็บรหัสผ่านไว้ที่อื่นอาจเป็นความคิดที่ดี มีหลายวิธีในการปกป้องข้อมูลของคุณ (และซอร์สโค้ด) - สำหรับ "if / when" … .. - แต่การแฮชรหัสผ่านที่มีขนาดไม่เกิน "gazillion bits" จะปลอดภัยเท่ากับผู้สร้างรหัสผ่าน / ระบบผู้เยี่ยมชม การส่งข้อมูลและมนุษย์ที่ให้บริการฮาร์ดแวร์เซิร์ฟเวอร์ ที่ถูกกล่าวว่า: ฉันไม่ได้บอกว่าการแฮชไม่มีประโยชน์ แต่ฉันกำลังบอกว่าถ้าวิธีการแก้ปัญหาของคุณซับซ้อนกว่านี้ฉันกลัวว่ามันจะไม่ได้ผลในอนาคตอันใกล้เกี่ยวกับคอมพิวเตอร์ควอนตัม

การแฮชซ้ำจะเพิ่มงาน / ต้นทุนให้กับความพยายามในการแฮ็ก ยิ่งทำซ้ำมากยิ่งแตกยากดังนั้นจึงสามารถใช้แฮชที่รวดเร็วเช่น SHA256 ได้ การทำซ้ำต้องเป็นแบบสุ่มและสามารถเปิดเผยต่อสาธารณะได้ password_hash()แสดงค่าใช้จ่ายในแฮชเอง
Victor Stoddard

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

13

ใช้SHA256. มันไม่สมบูรณ์แบบเช่นเดียวกับที่SHA512เหมาะสำหรับแฮชที่รวดเร็ว แต่ไม่มีตัวเลือกมันเป็นตัวเลือกที่แน่นอน ตามเทคโนโลยีการแฮชใด ๆ อย่าลืมใส่แฮชเพื่อเพิ่มความปลอดภัย

ในฐานะที่เป็นหมายเหตุเพิ่มเติม FRKT โปรดแสดงให้ฉันเห็นว่าใครสามารถทำลายแฮช SHA256 ที่เค็มได้อย่างง่ายดาย? ฉันสนใจที่จะเห็นสิ่งนี้อย่างแท้จริง

การแก้ไขที่สำคัญ:

ก้าวไปข้างหน้าโปรดใช้bcryptเป็นแฮชที่แข็งตัว ข้อมูลเพิ่มเติมสามารถพบได้ที่นี่


แก้ไขในการทำเกลือ:

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


1
แต่ได้รับการปรับให้เหมาะสมกับความเร็วซึ่งหมายความว่าพวกเขาเปิดใช้งานการแฮ็กแบบดุร้าย
arbales

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

1
ตามที่ระบุไว้ปัญหาของ MD และ SHA-series คือได้รับการปรับให้เหมาะสมกับความเร็ว เป็นเรื่องที่หลีกเลี่ยงไม่ได้ที่แฮชในลักษณะนี้จะไม่ปลอดภัยมากขึ้นเรื่อย ๆ เมื่อคอมพิวเตอร์พัฒนาขึ้น
Johannes Gorset

1
อะไร ๆก็แย่ลง / ไม่ปลอดภัย / ฯลฯ มากขึ้นเรื่อย ๆ เมื่อคอมพิวเตอร์พัฒนาขึ้น เมื่อ SHA512 ฯลฯ ถูกแฮ็กจะมีอัลกอริทึมที่ปลอดภัยมากขึ้น นี่คือลักษณะของการคำนวณไม่ว่าในกรณีใด ๆ
Kyle Rosendo

1
วิธีที่ดีในการทำเกลือใน php คืออะไร? มีโค้ดตัวอย่างไหม ฉันคิดว่าฉันไม่ควรเลือกอะไรอย่าง 'ยีราฟ'
Tony Stark

4

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

เนื่องจากมาตรการรักษาความปลอดภัยเพิ่มเติมให้ตั้งค่าสคริปต์ (bash, batch, python, ฯลฯ ) หรือโปรแกรมและตั้งชื่อที่คลุมเครือและตรวจสอบและดูว่า login.php มีการเปลี่ยนแปลงหรือไม่ (ตรวจสอบการประทับวันที่ / เวลา) และส่งอีเมลถึงคุณ ถ้ามี นอกจากนี้ควรบันทึกความพยายามทั้งหมดในการเข้าสู่ระบบด้วยสิทธิ์ของผู้ดูแลระบบและบันทึกความพยายามที่ล้มเหลวทั้งหมดในการเข้าสู่ระบบฐานข้อมูลและส่งบันทึกถึงคุณทางอีเมล


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

หากคุณสามารถเข้าถึงรหัสคุณสามารถแก้ไขและจัดเก็บรหัสผ่านทั้งหมดที่ผู้ใช้ส่งเป็นข้อความธรรมดาได้ ดังนั้นไม่หากรหัสถูกบุกรุกแล้ว GAME OVER
magallanes

3

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

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

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


1

MD5 เสียเนื่องจากปัญหาการชนกัน - รหัสผ่านที่แตกต่างกันสองรหัสอาจสร้าง md-5 เดียวกันได้

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

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

ผู้โจมตีทำอะไรได้ดีที่จะมีค่าแฮชหากสิ่งที่ผู้ใช้ของคุณป้อนคือรหัสผ่านธรรมดา

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

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


แม้ว่าฉันจะใช้การเข้ารหัสที่อ่อนแอกว่า แต่ในทางปฏิบัติก็ไม่มีระบบใดที่สามารถโจมตีแบบเดรัจฉานได้นานกว่า 1 ล้านครั้งต่อวินาที
magallanes

1
การเข้าสู่ระบบล้มเหลวสามครั้งและคุณถูกล็อก ช่วงเวลาท้ายเรื่อง แม้แต่รหัสผ่านที่ดูโง่ ๆ อย่าง "1234" ก็ยังปลอดภัยหากแฮกเกอร์ลองใช้ "รหัสผ่าน" "pa $$ word" และ "passw0rd" ก่อน (ล็อกเอาท์!) วิธีที่ผู้ใช้เข้าถึงการเข้าถึงในตอนนี้กลายเป็นจุดยึดด้านความปลอดภัยของคุณและสิ่งที่คุณทำขึ้นอยู่กับขนาดของฐานผู้ใช้ของคุณ ผู้ใช้ 200 คน? ให้พวกเขาโทรศัพท์เพื่อขอความช่วยเหลือ
UncaAlby

คำตอบนี้ไม่สมเหตุสมผลกับคนอื่นหรือเป็นแค่ฉัน?
Wildcard


1

ใช้argon2i . argon2ฟังก์ชั่นรหัสผ่านคร่ำเครียดได้รับรหัสผ่าน Hashing การแข่งขัน

ทางเลือกที่เหมาะสมอื่น ๆ ถ้าใช้argon2ไม่สามารถใช้ได้เป็นScrypt , bcryptและPBKDF2 Wikipedia มีหน้าสำหรับฟังก์ชันเหล่านี้:

MD5, SHA1 และ SHA256 เป็นไดเจสข้อความไม่ใช่ฟังก์ชันแฮชรหัสผ่าน ไม่เหมาะสำหรับวัตถุประสงค์นี้

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

นี่คือข้อเสนอแนะสำหรับการเขียนโปรแกรม PHP: อ่านPHP คำถามที่พบบ่อยแล้วใช้password_hash ()


0

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

MD5 อ่อนแอเนื่องจากสั้นและเป็นที่นิยมและในทางปฏิบัติทุกรุ่นที่ไม่มีรหัสผ่านนั้นอ่อนแอจากการโจมตีของพจนานุกรม แต่..

สมมุติว่าเรายังใช้ MD5 กับ SALT แฮกเกอร์ไม่ทราบ SALT แต่รู้รหัสผ่านของผู้ใช้เฉพาะ ดังนั้นพวกเขาสามารถทดสอบ: ????? 12345 โดยที่ 12345 คือรหัสผ่านและ ????? คือเกลือ แฮกเกอร์ไม่ช้าก็เร็วสามารถคาดเดา SALT ได้

อย่างไรก็ตามหากเราใช้ MD5 + SALT และใช้ MD5 แล้วจะไม่มีทางกู้คืนข้อมูลได้ อย่างไรก็ตามฉันพูดซ้ำ MD5 ยังสั้น

ตัวอย่างเช่นสมมติว่ารหัสผ่านของฉันคือ 12345 SALT คือ BILLCLINTON

md5: 827ccb0eea8a706c4c34a16891f84e7b

md5 ด้วยแฮช: 56adb0f19ac0fb50194c312d49b15378

mD5 ที่มีแฮชมากกว่า md5: 28a03c0bc950decdd9ee362907d1798a ฉันพยายามใช้บริการออนไลน์เหล่านั้นและไม่พบว่าไม่มีใครสามารถถอดรหัสได้ และ MD5 เท่านั้น! (อาจจะเป็นวันนี้มันจะบ้าคลั่งเพราะฉันสร้าง md5 ออนไลน์)

หากคุณต้องการที่จะฆ่ามากเกินไป SHA256 ก็เพียงพอแล้วหากทาด้วยเกลือและสองครั้ง

tldr MD5 (HASH + MD5 (รหัสผ่าน)) = โอเค แต่สั้น SHA256 ก็เพียงพอแล้ว


ปัญหาเกี่ยวกับการใช้ MD5 กับเกลือคือคอมพิวเตอร์สามารถสร้างการโจมตีแบบดุร้ายด้วยรหัสผ่านเดียวด้วยความเร็วสูงมาก shylor.com/2015/09/14/php-5-5-secure-password-hashing
Shylor

0

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

password_hash() example using Argon2i

<?php
echo 'Argon2i hash: ' . password_hash('rasmuslerdorf', PASSWORD_ARGON2I);
?>
The above example will output something similar to:

Argon2i hash: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.