Score:3

สิ่งนี้จะถือเป็นแฮชรหัสผ่านที่ปลอดภัยหรือไม่

ธง ng

ฉันคิดว่าฉันเข้าใจถูกต้องแล้ว แต่ฉันต้องการให้แน่ใจว่าสิ่งนี้เกี่ยวข้องกับเงิน

  1. ข้อกำหนดของรหัสผ่านคืออักขระขั้นต่ำ 16 ตัวและต้องมีหนึ่งใน [บน, ล่าง, หลัก, อื่นๆ] อย่างใดอย่างหนึ่ง
  2. เกลือของฉันคือ Crypto RNG สร้าง 64 ไบต์
  3. ฉันแปลงเกลือเป็น Base64 (โดยไม่ต้องต่อท้าย ==)
  4. ฉันได้รับ UTF8 ไบต์ของการต่อข้อมูล (SaltString + รหัสผ่าน)
  5. ฉัน SHA512 ไบต์เหล่านั้นในลูป 100k ครั้ง
ไบต์คงที่ส่วนตัว [] SaltPassphrase (ไบต์ [] เกลือรหัสผ่านสตริง)
{
    var sha512 = SHA512.Create();
    // เกลือเป็นสตริง Base64 (ไม่มี == ต่อท้าย) ตามด้วยรหัสผ่าน
    อินพุตสตริง = $"{Convert.ToBase64String(salt)[0..^2]}{รหัสผ่าน}";
    ไบต์ [] ไบต์ = sha512.ComputeHash (การเข้ารหัส UTF8.GetBytes (อินพุต));
    สำหรับ (int i = 0; i < 100_000; i++)
        ไบต์ = sha512.ComputeHash (ไบต์);
    ส่งคืนไบต์
}

แก้ไข ขอบคุณทุกคนสำหรับคำอธิบายโดยละเอียดและความคิดเห็นที่เป็นประโยชน์!

jp flag
คุณกำลังให้ความสำคัญกับเกลือมากเกินไป สิ่งที่จำเป็นจริงๆ ก็คือต้องมีเอกลักษณ์ ดังนั้นผู้โจมตีจึงไม่สามารถโจมตีแบบคู่ขนานกับหลายบัญชีที่มีเกลือเดียวกันได้ เกินกว่านั้นเกินกำลัง
hm flag
เห็นพ้องต้องกันว่าเกลือนั้นมีปริมาณมากเกินความจำเป็น แต่เกลือไม่ได้มีไว้สำหรับต้านทานการคำนวณแบบขนานเท่านั้น แต่ยังต้านทานการคำนวณแบบ *ก่อน* ด้วย ดังนั้นพวกเขาจึงไม่จำเป็นต้องมีเอกลักษณ์เฉพาะภายในขอบเขตของแฮชลิสต์ / แพลตฟอร์มเป้าหมายเท่านั้น แต่ยังต้องไม่ซ้ำกันในทางปฏิบัติ *ทั่วโลก* - เพียงพอที่จะทำให้ไม่สามารถคำนวณล่วงหน้าและจัดเก็บได้ ตัวอย่างเช่น bcrypt และ scrypt ใช้เกลือขนาด 128 บิต (16 ไบต์) ซึ่งค่อนข้างเล็กกว่า 64 ไบต์เล็กน้อย แต่ก็เพียงพอที่จะสร้างรายการของค่าทั้งหมดโดยมากไม่สามารถทำได้
marcelm avatar
cn flag
**[อย่าสร้างฟังก์ชันแฮชรหัสผ่านของคุณเอง](https://security.stackexchange.com/a/31846/99775) หยุดทั้งหมด**
Persistence avatar
br flag
@marcelm - ถ้าทุกคนทำตามคำแนะนำนั้น เราจะไม่มีฟังก์ชั่นการแฮชรหัสผ่าน... อาจจะใช้ "เว้นแต่คุณจะเป็นผู้เชี่ยวชาญในการเข้ารหัส"
marcelm avatar
cn flag
@Persistence ไม่ เพราะผู้คนมักจะคิดว่าพวกเขาเป็นผู้เชี่ยวชาญในสิ่งที่พวกเขาไม่ใช่ ความคิดเห็นนี้จัดทำขึ้นในบริบทของคำถาม SE นับไม่ถ้วนเกี่ยวกับการเข้ารหัสลับแบบ Hobe-brew และคำตอบคือ: _don't_ เสมอ cryptographers จริงที่ทำสิ่งนี้อย่างมืออาชีพจะไม่ถูกหยุดโดยความคิดเห็นเกี่ยวกับ crypto.SE อยู่ดี
Persistence avatar
br flag
คุณมีประเด็น... เอฟเฟกต์ Dunning Kreuger นั้นแข็งแกร่ง
Seth R avatar
in flag
@Persistence ผู้เชี่ยวชาญด้านการเข้ารหัสไม่ได้ต้องการคำแนะนำเกี่ยวกับ Stack Exchange หากคุณกำลังอ่านข้อความนี้ คุณไม่ควรสร้างฟังก์ชันแฮช
Persistence avatar
br flag
@SethR - ไม่จำเป็นต้องเป็นความจริง ... ฉันเป็นทั้งซอฟต์แวร์ผู้เชี่ยวชาญและวิศวกรอิเล็กทรอนิกส์จนถึงระดับสูงกว่าปริญญาตรีฉันยังคงใช้ Stack Overflow และ Electronics SE เพราะผู้เชี่ยวชาญคนอื่นๆ ก็ใช้เช่นกัน และไม่มีใคร แม้แต่ผู้เชี่ยวชาญ ก็สามารถรู้ทุกอย่างได้
Peter Morris avatar
ng flag
ฉันไม่ได้สร้างฟังก์ชันการเข้ารหัสลับ ฉันใช้ฟังก์ชันที่มีอยู่
marcelm avatar
cn flag
@PeterMorris ไม่ คุณสร้างฟังก์ชันการแฮชรหัสผ่านของคุณเอง การที่คุณใช้ SHA512 เป็นพื้นฐานในฟังก์ชันของคุณนั้นไม่เกี่ยวข้อง ค่อนข้างง่ายที่จะสร้างอัลกอริทึมที่ไม่ปลอดภัยโดยใช้บล็อคการสร้างที่ปลอดภัย [AES-ECB](https://crypto.stackexchange.com/a/20946/32547) จะเป็นตัวอย่างที่รู้จักกันดีในเรื่องนั้น การเข้ารหัสเป็นเรื่องยากมากที่จะทำให้ถูกต้อง นั่นเป็นเหตุผลว่าทำไมคนที่รู้ว่ากำลังทำอะไรอยู่จึงใช้อัลกอริทึมที่ผ่านการตรวจสอบมาเป็นอย่างดีซึ่งยืนหยัดต่อการตรวจสอบสาธารณะ การกลิ้ง crypto ของคุณเองจะทำให้คุณมีความเสี่ยงมากกว่าการใช้อัลกอริทึมที่รู้จักกันดี
Peter Morris avatar
ng flag
@marcelm อา ฉันเข้าใจแล้ว ขอบคุณสำหรับข้อมูลนั้น ฉันซาบซึ้งมาก!
in flag
"และต้องมีหนึ่งใน [บน, ล่าง, หลัก, อื่นๆ] อย่างใดอย่างหนึ่ง" -> ปกติแล้วฉันให้ผู้จัดการรหัสผ่านของฉันสร้างรหัสผ่านแบบสุ่มสำหรับแต่ละเว็บไซต์ แต่สำหรับเว็บไซต์ที่บังคับให้ฉันใช้อักขระพิเศษบางตัว ฉันมีรหัสผ่านเดียวที่โดยพื้นฐานแล้ว ประกอบด้วยอักขระพิเศษเท่านั้น โดยปกติจะเป็นเว็บไซต์ที่ไม่สำคัญ
marcelm avatar
cn flag
@PeterMorris ไม่มีปัญหา! ฉันยังพบข้อบกพร่องที่น่าสนใจในอัลกอริทึมของคุณ ทั้งหมดนี้มากเกินไปสำหรับความคิดเห็นดังนั้นฉันจึงเขียนคำตอบ
Wernfried Domscheit avatar
za flag
ทำไมคุณถึงตัด `==` ออกจากเกลือของคุณ
Wernfried Domscheit avatar
za flag
นอกเหนือจากทฤษฎีทั้งหมดที่ให้ไว้ในคำตอบต่างๆ: อย่างน้อยบางคนคิดว่าการพัฒนาอัลกอริทึมการแฮชเป็นเรื่องง่าย แต่ดูสิว่ามีอัลกอริทึมการแฮชของรหัสผ่าน (https://en.wikipedia.org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms) กี่แห่งหรือดีกว่านั้น ดูเหมือนจะเป็นงานที่ยากและมีผู้เชี่ยวชาญเพียงไม่กี่คนทั่วโลกเท่านั้น สามารถพัฒนาพวกเขาดูเหมือนว่าจะง่ายกว่ามากในการพัฒนา[ภาษาโปรแกรม](https://en.wikipedia.org/wiki/List_of_programming_languages)
Score:32
ธง in

ยกเว้นจำนวนการวนซ้ำ ( เราเถียงได้ว่าน้อยด้วย ¡ และการสูญเสียเอนโทรปีบางส่วน *) คำตอบคือไม่!

  • ไม่มี ความแข็งของหน่วยความจำ ซึ่งส่วนใหญ่จะป้องกันการค้นหา ASIC/GPU จำนวนมาก
  • ไม่มีหลายเธรดที่ทำให้การค้นหา CPU จำนวนมากเป็นอัมพาต

มีอัลกอริธึมการแฮชรหัสผ่านนอกเหนือจากแฮชการเข้ารหัส เช่น ซีรีส์ SHAx อยู่แล้ว ที่สำคัญคือ เข้ารหัส (2009), PBKDF2 (2543), อาร์กอน 2 (2558), และ การแฮชบอลลูน (2559). Argon2 เป็นผู้ชนะของ การแข่งขันแฮชรหัสผ่าน ที่จัดขึ้นในปี 2015 ตอนนี้ Balloon Hashing สามารถสู้กับ Argon2 ได้แล้ว ใช้ Balloon Hashing หรือ Argon2 สำหรับการแฮชรหัสผ่านที่ปลอดภัย

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

ห้องสมุด Argon2 ที่ดี

นี่คือพารามิเตอร์

การใช้งาน: ./argon2 [-h] salt [-i|-d|-id] [-t iterations] [-m memory] [-p parallelism] [-l hash length] [-e|-r] [- v (10|13)]
        รหัสผ่านถูกอ่านจาก stdin
พารามิเตอร์:
        เกลือ เกลือที่จะใช้อย่างน้อย 8 ตัว
        -i ใช้ Argon2i (นี่คือค่าเริ่มต้น)
        -d ใช้ Argon2d แทน Argon2i
        -id ใช้ Argon2id แทน Argon2i
        -t N กำหนดจำนวนการวนซ้ำเป็น N (ค่าเริ่มต้น = 3)
        -m N ตั้งค่าการใช้หน่วยความจำของ 2^N KiB (ค่าเริ่มต้น 12)
        -p N ตั้งค่าความขนานเป็น N เธรด (ค่าเริ่มต้น 1)
        -l N ตั้งค่าความยาวเอาต์พุตแฮชเป็น N ไบต์ (ค่าเริ่มต้น 32)
        -e เอาต์พุตแฮชที่เข้ารหัสเท่านั้น
        -r ส่งออกเฉพาะไบต์ดิบของแฮช
        -v (10|13) เวอร์ชัน Argon2 (ค่าเริ่มต้นเป็นเวอร์ชันล่าสุด ปัจจุบันคือ 13)

        -h พิมพ์การใช้งาน argon2

ฉันอาจจะถามว่าคืออะไร $i,d,$ และ $id$ ใน Argon2 คำตอบคือจาก ร่าง-irtf-cfrg-argon2-03;

หากคุณไม่ทราบความแตกต่างระหว่างพวกเขา หรือคุณพิจารณาว่าการโจมตีด้วยช่องทางด้านข้างเป็นภัยคุกคามที่ทำงานได้ เลือก Argon2id.

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

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

  • อาร์กอน2id ในช่วงครึ่งแรกของการวนซ้ำครั้งแรกจะทำงานเป็น Argon2i และส่วนที่เหลือจะทำงานเป็น Argon2d สิ่งนี้เปิดใช้งานทั้งการป้องกันช่องทางด้านข้างและการแลกเปลี่ยนหน่วยความจำเวลา

การแฮชบอลลูน

ตอนนี้มันอยู่ใน NIST สิ่งพิมพ์พิเศษ 800-63B และต้องใช้เวลาในการปรับตัว มี ห้องสมุดบางส่วนพร้อมใช้งาน.

คุณสมบัติหลักคือ

  • ความแข็งของหน่วยความจำได้รับการพิสูจน์แล้ว
  • ได้รับการออกแบบบนพื้นฐานดั้งเดิม: สามารถใช้ฟังก์ชันแฮชการเข้ารหัสแบบฮาร์ดที่ไม่มีหน่วยความจำใดๆ เช่น SHA2, SHA3 และ BLAKE2
  • มีความต้านทานในตัวต่อการโจมตีช่องทางด้านข้างซึ่งต้องการให้รูปแบบการเข้าถึงหน่วยความจำเป็นอิสระจากบิตของข้อมูลที่จะแฮช

เล็กน้อยเกี่ยวกับรหัสผ่าน

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

เล็กน้อยเกี่ยวกับผู้จัดการรหัสผ่าน

นอกจากนี้ เกือบทุกคนมีสมาร์ทโฟน หนึ่งสามารถใช้ ผู้จัดการรหัสผ่าน เพื่อจัดเก็บรหัสผ่านที่เกือบจะเป็นรหัสผ่านแบบสุ่มที่สร้างโดยผู้จัดการรหัสผ่านและจัดเก็บไว้ แจ้งให้ผู้ใช้ทราบเกี่ยวกับเรื่องนี้ด้วย บางส่วนของพวกเขาฟรีเช่น LastPass, 1รหัสผ่าน, และ คีพาส.


ตอบกลับความคิดเห็น:

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

SHA-512 มีการใช้หน่วยความจำน้อยมากในรหัสผ่าน ต้องจัดเก็บเพียง 1024 บิตเพื่อสร้างแฮชรหัสผ่าน พารามิเตอร์หน่วยความจำเริ่มต้นของ Argon2 คือ $2^{12}$KiB = 4MiB หากเราพิจารณาว่าระบบสามารถเรียกใช้เธรดเท่าใดก็ได้ พลังในการบังคับเดรัจฉานตามอัลกอริทึมที่ใช้ SHA-512 จะลดลง 32768 เท่า ดังนั้น การใช้หน่วยความจำเพียงเล็กน้อยก็ช่วยเสริมความแข็งแกร่งให้กับความซับซ้อนในการแฮชรหัสผ่าน $2^{15}$. 4MiB นั้นใช้ได้ดีสำหรับเซิร์ฟเวอร์และสามารถปรับหน่วยความจำตามการเข้าถึงการเข้าสู่ระบบต่อวินาที หรือซื้อหน่วยความจำเพิ่มดีกว่า โปรดจำไว้ว่าอัลกอริธึมการแฮชรหัสผ่านจะทิ้งหน่วยความจำไว้ที่ระบบ คอขวดที่ต้องพิจารณาคือจำนวนคำขอเข้าสู่ระบบต่อวินาที


â¡) ผลความเร็ว OpenSSL แสดงให้เห็นว่า SHA-512 100K มีขนาดเล็ก

ทำ sha512 เป็นเวลา 3 วินาทีบนบล็อกขนาด 64 บล็อก: 10896142 sha512 ใน 3.00 วินาที
ทำ sha512 เป็นเวลา 3 วินาทีบนบล็อกขนาด 256 บล็อก: 4673961 sha512 ใน 2.99 วินาที

*) เราสูญเสียเอนโทรปีเท่าใดต่อการวนซ้ำของฟังก์ชันแฮชการเข้ารหัส

Ossifrage คลื่นไส้ เขียนคำตอบที่ดีเกี่ยวกับเรื่องนี้. หลักของผลลัพธ์คือ

แต่มีโอกาสดีที่ฟังก์ชัน F คงที่ใดๆ จะมีมากมาย รอบ โดยที่ F เป็นการเรียงสับเปลี่ยน และจำกัดให้ F รักษาค่าเอนโทรปีไว้

Peter Morris avatar
ng flag
ฉันไม่สามารถใช้อัลกอริทึมที่ใช้หน่วยความจำจำนวนมากได้ (หากฉันเข้าใจ Memory Hardness อย่างถูกต้อง) เนื่องจากเป็นเซิร์ฟเวอร์ แนวทางถูกต้องหรือไม่ SHA512 เหมาะสมหรือไม่ และการวนซ้ำเหมาะสมหรือไม่เมื่อพิจารณาจากความยาวของรหัสผ่าน
kelalaka avatar
in flag
@PeterMorris ฟังก์ชันแฮชรหัสผ่านมีพารามิเตอร์ที่ปรับได้ คุณต้องกำหนดเป้าหมายความปลอดภัยของคุณ จากนั้นปรับพารามิเตอร์ หากคุณไม่สามารถใช้หน่วยความจำสูงได้ คุณต้องเพิ่มจำนวนการวนซ้ำ คุณสามารถค้นหาประสิทธิภาพได้ในฟอรัม hashcat โดยเฉพาะสำหรับ GPU
stefreak avatar
jp flag
อัลกอริทึมการแฮชรหัสผ่านของ @PeterMorris ถูกใช้บนเซิร์ฟเวอร์เกือบ 100% ของเวลาทั้งหมด Google ฉบับย่อเปิดเผยว่า Argon2 ใช้หน่วยความจำ 1MiB เป็นค่าเริ่มต้น นี่เป็นเรื่องปกติและมักจะไม่เป็นปัญหา โปรดอย่าใช้การแฮชรหัสผ่านของคุณเอง สิ่งนี้ยากที่จะทำให้ถูกต้อง โดยเฉพาะอย่างยิ่งหากเดิมพันสูง
Cort Ammon avatar
gb flag
ในมุมมองของความคิดเห็นของ Stefreak ในราคาตลาดปัจจุบัน คุณกำลังพูดถึงบางสิ่งที่มีมูลค่าถึงสี่ในสิบของหน่วยความจำ DDR4 ที่คุ้มค่าเงิน หากนั่นเป็นสิ่งที่ยอมรับไม่ได้ ฉันคิดว่ามันคุ้มค่าที่จะคิดนานและหนักใจว่าคุณมีโครงสร้างพื้นฐานที่จำเป็นสำหรับระบบที่เกี่ยวข้องกับเงินหรือไม่
il flag
@kelalaka มีเหตุผลอะไรที่คุณแนะนำ `argon2` มากกว่าบางอย่างเช่น https://en.wikipedia.org/wiki/Bcrypt?
kelalaka avatar
in flag
@N3buchadnezzar ส่วนใหญ่แล้ว Bcrypt นั้นใช้งานได้ดีตามที่ระบุไว้ใน [Wikipedia](https://en.wikipedia.org/wiki/Bcrypt#Comparison_to_other_password_hashing_algorithms) อย่างไรก็ตาม Argon2 มีปัจจัยการขนาน การต้านทานช่องสัญญาณด้านข้าง และการแยกพารามิเตอร์อิสระ (ดูพารามิเตอร์ของไลบรารีและเปรียบเทียบกับของ BCrypt) และ Argon2 ก็เป็น A KDF Bcrypt ไม่ใช่เช่นกัน
Peter Morris avatar
ng flag
@kelalaka ขอบคุณสำหรับการตอบกลับโดยละเอียดของคุณ ฉันได้อัปเดตคำถามเกี่ยวกับ argon2 แล้ว คุณช่วยบอกฉันได้ไหมว่าคุณคิดอย่างไร ขอบคุณ!
kelalaka avatar
in flag
@PeterMorris เมื่อตอบแล้วอย่าเปลี่ยนแหล่งที่มาโดยเฉพาะอย่างยิ่งหลังจากทั้งหมดนี้ คุณสามารถถามคำถามใหม่แทนได้ ฉันย้อนกลับมาแล้ว
kelalaka avatar
in flag
@PeterMorris และฉบับของคุณอาจเหมาะกับ [security.se] ด้วยเช่นกัน ค้นหาคำตอบที่นั่นด้วย
Peter Morris avatar
ng flag
@kelalaka เอาล่ะฉันคิดว่ามันก็โอเคที่จะต่อท้าย ฉันต้องใช้พารามิเตอร์ประเภทใดสำหรับขนาดหน่วยความจำ + การวนซ้ำ ฉันไม่ต้องการให้เซิร์ฟเวอร์ของฉันพิการ แต่ก็ไม่ต้องการให้เซิร์ฟเวอร์พังง่ายเช่นกัน
kelalaka avatar
in flag
@PeterMorris พารามิเตอร์เริ่มต้น? คุณสามารถวัดเวลาบนเซิร์ฟเวอร์ของคุณ โดยทั่วไปแล้ว เรากำหนดให้กระบวนการทั้งหมดต้องสิ้นสุดใน 1 วินาที เนื่องจากเราไม่ต้องการให้เกิดความล่าช้าสำหรับผู้ใช้ คุณสามารถวัดผลเซิร์ฟเวอร์ของคุณและสอบถามเกี่ยวกับสิ่งนี้ได้ที่ [security.se] ดู [สิ่งนี้](https://security.stackexchange.com/questions/210982/what-are-the-minimum-parameters-for-argon2) หรือ [ ค้นหา](https://security.stackexchange.com/search?q=argon2+parameter)
polfosol avatar
in flag
เกร็ดเล็กน้อย: Lastpass **ไม่** ฟรี มันแสร้งทำเป็นเป็นเช่นนั้น
Score:10
ธง in

นอกเหนือจากคำตอบที่ยอดเยี่ยมของ @ kelalka มันคุ้มค่าที่จะชี้ให้เห็นถึงความแตกต่างที่สำคัญระหว่างการใช้งานของคุณและวิธีการแฮชแบบวนซ้ำมาตรฐานเช่น PBKDF2 แม้ว่า PBKDF2 จะไม่ใช่ฮาร์ดหน่วยความจำ เช่นเดียวกับอัลกอริธึมการแฮชรหัสผ่านที่ใหม่กว่าบางตัว ฉันถือว่า (หรือ bcrypt) เพียงพอสำหรับวัตถุประสงค์ส่วนใหญ่ อาจคล้ายกับวิธีแก้ปัญหาที่คุณเสนอมากที่สุด ดังนั้นจะเข้าใจได้ง่ายขึ้น https://en.wikipedia.org/wiki/PBKDF2

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

นอกจากนี้ ข้อกำหนดด้านความซับซ้อนของรหัสผ่านยังถือเป็นอันตรายอีกด้วย พิจารณานโยบายรหัสผ่านที่ทันสมัย: https://auth0.com/blog/dont-pass-on-the-new-nist-password-guidelines/

Maarten Bodewes avatar
in flag
คุณหมายถึงอะไรกับการบรรจบกันของแฮช? วงจร (ดูเหมือนว่า)? และถ้าเป็นเช่นนั้น การรวมค่าคงที่ (ภายในการวนซ้ำ) ช่วยให้คุณรอดพ้นจากสิ่งนั้นได้อย่างไร
ar flag
@MaartenBodewes: ฉันคิดว่า Meir หมายถึงอะไรโดยการลู่เข้าเป็นความจริงที่ว่าเนื่องจากฟังก์ชันแฮชการเข้ารหัสลับ (จำกัด เฉพาะช่วงเอาต์พุต) ไม่ใช่ bijections การวนซ้ำแฮชจะค่อยๆ ลดจำนวนเอาต์พุตที่เป็นไปได้ และเพิ่มความเสี่ยงดังกล่าว แฮชที่วนซ้ำมาชนกัน: ถ้า $H^{(m)}(a)=H^{(m)}(b)$ สำหรับบาง $m$ ดังนั้น $H^{(n)}(a)=H^{ (n)}(b)$ สำหรับ $nâ¥m$ ทั้งหมด รวมถึงอินพุตดั้งเดิมในฟังก์ชันแฮช (เช่น การแทนที่ $H$ ด้วยบางอย่างเช่น $H_a(x) =H(x\ ||\ a)$ ป้องกันสิ่งนี้: $H_a^{(m)}(a)=H_b^ {(m)}(b)$ ไม่ _not_ หมายถึง $H_a^{(n)}(a)=H_b^{(n)}(b)$ สำหรับ $n>m$
ar flag
⦠ที่กล่าวว่า ตราบใดที่ฟังก์ชันแฮช $H$ มีความยาวเอาต์พุตที่เหมาะสม การชนกันจะไม่ใช่ปัญหาหลัก แม้แต่สำหรับฟังก์ชันแฮชที่วนซ้ำโดยไม่มีการปรับแต่งดังกล่าว ฉันคิดว่าฉันมีคำตอบเก่า ๆ ที่นี่ที่ฉันทำคณิตศาสตร์ แต่โดยพื้นฐานแล้วหากขนาดของพื้นที่อินพุต _actual_ ของแฮชที่วนซ้ำ (รวมทั้งรหัสผ่านจริงและทุกสิ่งที่พยายามโดยผู้โจมตีที่ดุร้าย) ต่ำกว่าขอบเขตวันเกิด การชนกัน ส่วนใหญ่ไม่เกี่ยวข้อง สำหรับแฮชสมัยใหม่ที่มีเอาต์พุต 256 บิตขึ้นไป เกือบจะเป็นเช่นนั้น
Maarten Bodewes avatar
in flag
อืม เข้าท่านะ แม้ว่าฉันคิดว่าการคาดการว่าจะเกิด 256 บิตชนกันก็ยังเป็นความคิดที่ค่อนข้างไกลตัว ตอนนี้ฉันเข้าใจแล้วว่าทำไมโดยทั่วไปแล้วเกลือหรือรหัสผ่านจึงซ้ำกันในการป้อนข้อมูล .... เอ่อใช่สิ่งที่คุณพูด :P
Meir Maor avatar
in flag
หากเรามี PRF จริง ปัญหาก็ดูเล็กน้อย แต่เรากังวลว่าเราไม่มี PRF ที่แท้จริง และการแฮชซ้ำแบบไร้เดียงสาอาจขยายความไม่สมบูรณ์เล็กน้อยของ PRF ของเรา ฉันไม่เห็นเหตุผลที่จะทิ้งปัญหาเล็กน้อยที่แก้ไขได้เล็กน้อย
ilkkachu avatar
ws flag
เรื่องที่ค่อนข้างเกี่ยวข้องกันคือเนื่องจากสิ่งของของพวกเขาค่อนข้างใกล้เคียงกับ PBKDF2 อยู่แล้ว พวกเขาก็อาจจะ _ใช้ PBKDF2_ เช่นกัน ดังนั้นอย่างน้อยพวกเขาก็จะได้รับรู้อะไรบางอย่าง
Meir Maor avatar
in flag
แน่นอนฉันบอกว่ามันคล้ายกับ PBKDF2 และเห็นได้ชัดว่าผู้คนควรใช้สิ่งมาตรฐาน PBKDF2 ไม่ทันสมัย ​​แต่ก็ยังเพียงพอเมื่อปรับ IMHO อย่างเหมาะสม แม้ว่าโดยส่วนตัวแล้วฉันจะชอบตัวเลือกที่สมเหตุสมผลน้อยที่สุด แต่ฉันเคยชอบ bcrypt มากกว่าและมีข้อดีของการไม่ด่างพร้อยตลอดไป และตอนนี้เรามีตระกูล argon และ scrypt ดังนั้นแม้ว่าฉันเห็นว่า PBKDF2 เพียงพอแล้ว แต่ IMHO เป็นตัวเลือกที่สมเหตุสมผลที่สุด
kelalaka avatar
in flag
@IlmariKaronen มี [ที่นี่](https://crypto.stackexchange.com/q/15068/18298)
Score:9
ธง cn

คุณควรออกแบบแฮชรหัสผ่านของคุณเอง

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

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

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

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

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

มีอะไรผิดพลาดได้บ้าง?

ดังนั้นจึงอาจมีปัญหากับแกนหลักของอัลกอริทึมการเข้ารหัสลับ นี่คือสิ่งที่ทำให้ MD5 และ RC4 พัง

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

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

ในฟังก์ชันแฮชของคุณ?

ฟังก์ชันการแฮชรหัสผ่านของคุณเองก็ตกเป็นเหยื่อของสิ่งนี้เช่นกัน:

ทำซ้ำ 100_000:
    แฮช = sha512 (แฮช)

SHA-512 นั้นใช้ได้อย่างสมบูรณ์แบบ (เท่าที่เรารู้) ใช้แบบนี้ถือว่าพลาด

SHA-512 สร้างเอาต์พุต 512 บิตที่ "แยกแยะไม่ออกจากการสุ่ม" สำหรับทุกอินพุต มันอาจสร้างเอาต์พุตเดียวกันสำหรับสองอินพุตที่แตกต่างกัน ซึ่งเรียกว่าการชนกัน ปัญหาคือโดยทั่วไปแล้วฟังก์ชันแฮช N-บิตบนอินพุต N-บิตไม่ใช่ วัตถุประสงค์. ซึ่งหมายความว่าเมื่อป้อนเอาต์พุต SHA-512 ให้กับตัวมันเอง ค่า 512 บิตที่เป็นไปได้บางค่าจะชนกับค่าอื่น ทำให้เกิดเอาต์พุตเดียวกัน โดย ความจำเป็นซึ่งหมายความว่าไม่สามารถสร้างค่าแฮชอื่นๆ บางค่าได้เลย

ลองดูวิธีการทำงานสำหรับ SHA-512 ที่ตัดเหลือ 4 บิต โดยเฉพาะอย่างยิ่ง เรารับไบต์แรกจากเอาต์พุต และนำ 4 บิตสูงเป็นศูนย์ในไบต์นี้ ไบต์เดียวที่เป็นผลลัพธ์จะถูกใช้เป็นอินพุตสำหรับรอบถัดไป วิธีเลือกบิตต่างกันให้ผลลัพธ์ต่างกัน แต่หลักการเหมือนกัน

การลองอินพุตที่เป็นไปได้ทั้งหมด 16 รายการสำหรับหลายๆ รอบทำให้เรามีห่วงโซ่เหล่านี้:

ใน 1. 2. 3. 4. 5. 6. 7.
00 -> 08 -> 06 -> 08 -> 06 -> 08 -> 06 -> 08
06 -> 08 /
07 -> 06 -> 08 -> 06 -> 08 -> 06 -> 08 -> 06
08 -> 06 /   
03 -> 04 -> 05 \
13 -> 15 -> 05 -> 09 -> 02 -> 10 -> 14 -> 14
04 -> 05 -> 09 -> 02 -> 10 -> 14 -> 14 /
15 -> 05 -> 09 -> 02 -> 10 -> 14 /
05 -> 09 -> 02 -> 10 -> 14 -> 14  
01 -> 11 -> 02 -> 10 -> 14 /
09 -> 02 -> 10 -> 14 -> 14  
11 -> 02 -> 10 -> 14 /
02 -> 10 -> 14 -> 14  
12 -> 10 / /
10 -> 14 -> 14   
14 -> 14 /

หลังจากผ่านไปเพียง 6 รอบ เอาต์พุตที่เป็นไปได้ 16 รายการได้ลดลงเหลือเพียง 3 เอฟเฟกต์เดียวกันนี้สามารถเห็นได้สำหรับการตัดทอนที่ใหญ่ขึ้น ฉันเรียกใช้การจำลองบางอย่างสำหรับ SHA-512 ที่ตัดทอนเป็น 1 ไบต์แรก (2â¸), 2 ไบต์ (2¹â¶) และ 3 ไบต์ (2²â´):

                ไบต์: 1 2 3
          ช่องใส่ข้อมูล: 256 65536 16777216
รวมกันเป็นค่า M: 13 330 2765
       หลังจาก N รอบ: 31 518 7114

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

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

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

คำตอบอื่นๆ ได้ให้คำแนะนำเกี่ยวกับแฮชที่จะใช้แล้ว ตกลง: pbkdf2, bcrypt ดีกว่า: argon2, scrypt ฉันได้ยินมาว่าบอลลูนเป็นสิ่งหนึ่ง แต่ฉันไม่รู้อะไรเลยเกี่ยวกับเรื่องนี้ ดังนั้นฉันจึงไม่มีความคิดเห็นเกี่ยวกับเรื่องนี้

kelalaka avatar
in flag
แจ้งให้ทราบ มีการคำนวณหนึ่งรายการสำหรับกรณีทั่วไป [เอนโทรปีเมื่อวนซ้ำฟังก์ชันแฮชการเข้ารหัส](https://crypto.stackexchange.com/q/15068/18298) ฉันจำได้อีก แต่ไม่พบ
chux - Reinstate Monica avatar
คำตอบที่ดีซึ่งระบุรหัสของ OP โดยตรง
kelalaka avatar
in flag
ตกลง [ฉันพบสิ่งที่ต้องการแล้ว](https://crypto.stackexchange.com/a/51029/18298) และคำตอบนั้นน่าประหลาดใจสำหรับคุณ เราไม่คาดหวังว่าฟังก์ชันแฮชการเข้ารหัสแบบวนซ้ำจะสูญเสียเอนโทรปีมากเกินไปเนื่องจาก [คาดว่าวงรอบใหญ่](https://crypto.stackexchange.com/a/68442/18298)โดยงานของแฮร์ริส
marcelm avatar
cn flag
@kelalaka น่าสนใจมาก ขอบคุณสำหรับลิงค์! แต่ถ้าฉันเข้าใจ [ลิงก์ที่สาม](https://crypto.stackexchange.com/a/68442) ถูกต้อง แสดงว่าองค์ประกอบที่ค่อนข้าง _few_ คาดว่าจะอยู่ในวงจร อันที่จริงประมาณ ââ ของพวกมัน ดังนั้นการวนซ้ำจะลดพื้นที่ที่มีประสิทธิภาพลงในรากที่สองขององค์ประกอบในท้ายที่สุด ลดความยาวบิตที่มีประสิทธิภาพลงครึ่งหนึ่ง หรือฉันตีความหมายอะไรผิดไป?
kelalaka avatar
in flag
จุดที่คุณอาจพลาดไปคือ 1M นั้นเล็กเกินไปที่จะเห็นผลนี้ ลิงก์แรกพูดถึงการวนซ้ำ 256 ครั้ง และลิงก์ที่สามพูดถึงเวลาที่การวนซ้ำไปที่รากที่สอง องค์ประกอบส่วนใหญ่ยังอยู่ที่หาง...
marcelm avatar
cn flag
ยุติธรรมเพียงพอ คณิตศาสตร์ประเภทนั้นน่าสนใจเสมอ แต่ก็ยากที่จะเข้าใจมาตราส่วนที่เกี่ยวข้องได้ดี ฉันสังเกตเห็นผลกระทบที่จำกัดเนื่องจากจำนวนรอบในคำตอบเดิมของฉัน แต่ส่วนทั้งหมดนั้นเป็นเพียงลางสังหรณ์อยู่ดี :)
Score:1
ธง cn

คิดว่าคำตอบคือ: "ปลอดภัย" นั้นสัมพันธ์กัน เกลือ 512 บิต (8*64 บิต) เพียงอย่างเดียวให้ความเป็นไปได้ประมาณ 6*10^57 การเปลี่ยนรูปเกลือ (ผ่าน BASE64) จะไม่เปลี่ยนความแข็งแรง

จากนั้นคุณมี 992 บิต (62*16 บิต) ที่สร้างรหัสผ่าน (26*2 ตัวอักษรบวก 10 หลัก) หรือความเป็นไปได้ประมาณ 4*10^28 สมมติว่าความน่าจะเป็นเหมือนกัน (ค่อนข้างไม่น่าเป็นไปได้หากมนุษย์เลือก) คุณจะมีบิตอินพุตประมาณ 1504 บิตเพื่อสร้างบิตเอาต์พุต 512 บิต สูงสุด (มีความเป็นไปได้ที่จะเกิดความขัดแย้ง) 5*10^452 ความเป็นไปได้ นั่นคือ ใหญ่ ตัวเลข.

ตัวเลขจะถือว่าเกลือไม่สามารถ "แยกตัวประกอบ" จากแฮชได้ ดังนั้นเกลือจึงขยายช่วงการค้นหา

การทำซ้ำแฮชจะทำให้การสร้างตารางช้าลงเท่านั้น และไม่ค้นหาผลลัพธ์ (ตารางผลลัพธ์จะมีขนาดใหญ่สุด 2^512 รายการ)

kelalaka avatar
in flag
เราถือว่าเกลือนั้นเป็นของสาธารณะ สำหรับผู้โจมตีแบบเดรัจฉานจะป้องกันเฉพาะตารางสายรุ้งและพวกเขาจะค้นหาเฉพาะรหัสผ่านไม่ใช่รหัสผ่านและเกลือ ผู้โจมตีระบบจะได้รับเกลือและแฮช พวกเขามักจะเก็บไว้ในสตริง ดังนั้นความแข็งแกร่งของรหัสผ่านและกลไกการแฮชรหัสผ่านจึงมีความสำคัญ
kelalaka avatar
in flag
เกลือฆ่าโต๊ะสายรุ้ง ที่เห็นได้ชัด อย่างไรก็ตาม ความปลอดภัยของการแฮชรหัสผ่านไม่ได้ขึ้นอยู่กับความลับของเกลือ

โพสต์คำตอบ

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