Score:0

ความจำเป็นของ PBKDF2 ในการตั้งค่าปัจจุบันหรือไม่

ธง ie

ฉันมีรหัสผ่านเดียวซึ่งเป็นไบต์สุ่มที่เข้ารหัสฐานข้อมูล ตอนนี้ฉันกำลังใช้รูปแบบการเข้ารหัสของ https://gist.github.com/jbtule/4336842. โดยสรุป เราใช้รหัสผ่านเดียวของเรา สร้างเกลือสำหรับคีย์รับรองความถูกต้องและคีย์เข้ารหัส รัน PBKDF2 พร้อมการวนซ้ำ 10,000 ครั้งเพื่อสร้างคีย์ จากนั้นใช้ AES เพื่อเข้ารหัสและ HMAC เพื่อรับรองความถูกต้อง จากนั้นเกลือจะถูกเก็บไว้ถัดจากไซเฟอร์เท็กซ์

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

ฉันกำลังคิดที่จะใช้รหัสผ่านเดียวและเชื่อมมันเข้ากับ crypt และ auth salt ก่อนการเข้ารหัส/ถอดรหัส AES และ HMAC ฉันอาจเปลี่ยนการวนซ้ำ PBKDF2 ให้เหลือค่าต่ำเช่น ~10 ซึ่งอาจดูเลอะเทอะแต่จะเกี่ยวข้องกับการเปลี่ยนโค้ดน้อยลงและการทดสอบน้อยลง มีช่องโหว่ด้านความปลอดภัยที่ฉันหายไปที่นี่หรือไม่? วิธีแก้ปัญหาอย่างใดอย่างหนึ่งเหล่านี้จะเปิดโอกาสให้ฉันถูกโจมตี ใช้กำลังดุร้ายหรืออย่างอื่นหรือไม่ จากสิ่งที่ฉันอ่านเกี่ยวกับการสร้างคีย์ ดูเหมือนว่าฉันไม่ต้องการมัน แต่โซลูชันโฮมบรูว์มักจะแย่ ดังนั้นฉันจึงระมัดระวังอย่างมากในการลบการรักษาความปลอดภัยที่เรามี ขอบคุณสำหรับความช่วยเหลือของคุณ.

Swashbuckler avatar
mc flag
ตราบใดที่รหัสผ่านมีความยาวอย่างน้อยเท่ากับคีย์และเป็น *จริง* แบบสุ่ม (สร้างโดยตัวสร้างตัวเลขสุ่มแบบเข้ารหัส) คุณไม่จำเป็นต้องใช้ PBKDF2 หากทั้งสองข้อไม่เป็นความจริง คุณยังคงสามารถใช้ PBKDF2 และปล่อยจำนวนการวนซ้ำหากเป็นสาเหตุของปัญหาด้านประสิทธิภาพจริงๆ
SAI Peregrinus avatar
si flag
โปรดทราบว่าคีย์สุ่มจริงสามารถมีอักขระ NULL ฝังอยู่ (0x00) ในขณะที่รหัสผ่านเป็นสตริง (โดยปกติคือ UTF-8) ดังนั้นจึงไม่สามารถมี NULL ฝังอยู่ได้ (และโดยปกติจะไม่มีอักขระอื่นๆ ที่ไม่สามารถพิมพ์ได้) ดังนั้นจึงมีน้อยกว่า เอนโทรปีเกินกว่าความยาวจะระบุได้ PBKDF รับรหัสผ่านเป็นสตริง และส่งออกลำดับของไบต์ ดังนั้นแม้ว่าจะสร้าง "รหัสผ่าน" ของคุณด้วย CSPRNG คุณก็ยังต้องการใช้ KDF เพื่อแปลงจากอักขระที่ "พิมพ์ได้" เป็นคีย์
Swashbuckler avatar
mc flag
@SAIPeregrinus ใช่ฉันเคยเห็นปัญหาการทำงานร่วมกันซึ่งการใช้งานหนึ่งสามารถจัดการกับค่าว่างได้ แต่อีกอันไม่สามารถทำได้
Score:1
ธง ng

เมื่อใดก็ตามที่ใช้ PBKDF2 เป็น KDF ที่มีคีย์ของเอนโทรปีขนาดใหญ่ พารามิเตอร์การวนซ้ำสามารถเป็น 1 ได้อย่างปลอดภัย ซึ่งควรปรับปรุงปัญหาที่เกิดขึ้นอย่างเห็นได้ชัดด้วยการทำงานเพียงเล็กน้อย ซึ่งจะใช้ได้หากคีย์เป็นรหัสผ่านที่มีเอนโทรปีอย่างน้อย 128 บิต (เช่น อักขระ 22 ตัวสุ่มเลือกจาก 64 ตัว)

ในทางกลับกัน หากรหัสผ่านนั้นง่ายพอที่จะจดจำได้ หรือใส่เข้าไปอย่างสะดวก หรือเลือกโดยผู้ใช้ที่มีแรงจูงใจน้อยหรือมีวิจารณญาณไม่เพียงพอที่จะใช้รหัสผ่านที่ดี ก็จำเป็นต้องมีบางประเภท การยืดที่สำคัญเช่นเดียวกับที่ PBKDF2 มีให้ อย่างไรก็ตาม PBKDF2 เป็นวิธีการยืดคีย์ที่แย่มาก การวนซ้ำ 10,000 PBKDF2 เกือบจะโปร่งใสสำหรับผู้โจมตีที่ใช้ ASIC และอุปสรรคที่เอาชนะได้สำหรับผู้ที่ใช้ GPU ฉันขอแนะนำให้เปลี่ยนไปใช้สิ่งที่ดีกว่า (เกี่ยวกับหน่วยความจำ): Argon2, scrypt หรือแม้แต่ bcrypt ที่น้อยกว่าโดยเร็วที่สุดสำหรับส่วนที่ยืดรหัสผ่าน และแม้ว่าคุณจะทำเช่นนี้ คุณก็ต้องมีทางเลือกที่ดีกว่าการทำบ่อยจนกลายเป็นปัญหาคอขวด

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

โพสต์คำตอบ

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