Score:7

ฉันจำเป็นต้องฆ่าเชื้ออินพุตของผู้ใช้เพื่อเข้ารหัสหรือเพื่อ PBKDF โดยทั่วไปหรือไม่

ธง tr

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

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

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

jp flag
โดยทั่วไป คุณไม่ *ไม่* ต้องฆ่าเชื้อหรือตรวจสอบความปลอดภัย *อะไร* เว้นแต่จะมีเหตุผลเฉพาะ...แต่ *มีเหตุผลมากมาย* เหล่านั้นอยู่ ดังนั้นจึงเป็นการดีที่จะถือว่าคุณทำจนกว่าจะแสดงเป็นอย่างอื่น
Score:19
ธง fr

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

อย่างไรก็ตาม หากคุณยอมรับรหัสผ่านที่มีอักขระที่ไม่ใช่ ASCII คุณอาจต้องการทำ Unicode ให้เป็นมาตรฐานในสตริง (อาจเป็น NFC) เนื่องจากมักมีหลายวิธีในการแสดงอักขระตรรกะเดียวกัน ตัวอย่างเช่น คุณสามารถแสดง "é" เป็นจุดโค้ดเดียว (U+00E9) หรือเป็นโค้ดพอยต์สองจุด (U+0065 U+0301) และการทำให้เป็นมาตรฐานจะเขียนสิ่งเหล่านี้ใหม่เป็นสตริงเดียวกัน อีกครั้ง ไม่มีปัญหาด้านความปลอดภัยในเรื่องนี้ แต่เนื่องจากผู้ใช้จะคิดว่ารหัสผ่านทั้งสองนี้เหมือนกันเมื่อมีลำดับไบต์ต่างกัน การดำเนินการทำให้เป็นมาตรฐานทำให้ระบบของคุณสามารถคิดว่ารหัสผ่านเหล่านี้เป็นรหัสผ่านเดียวกันได้เช่นกัน

phoenixdown avatar
tr flag
โอ้ เจ๋งมาก ฉันไม่คิดว่าจะทำให้เป็นมาตรฐาน ขอบคุณ! มีวิธีง่ายๆ ในการทำ normailzation NFC Unicode ใน javascript (nodejs) ที่คุณอาจชอบหรือไม่? ฉันจะมี google เกี่ยวกับเรื่องนี้ด้วย ขอบคุณ
Aman Grewal avatar
gb flag
@phoenixdown javascript มีวิธีทำให้เป็นมาตรฐานในตัว https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize
jp flag
@phoenixdown: โปรดทราบว่ามี "การทำให้เป็นมาตรฐาน" ประเภทอื่นที่อาจหรือไม่สมเหตุสมผล เป็นคำถามเกี่ยวกับการใช้งานมากกว่าความปลอดภัย ตัวอย่างเช่น ฉันเชื่อว่า Facebook ลดขนาดรหัสผ่านลงเพื่อป้องกันปัญหาเนื่องจากแป้น Shift ค้าง/แคปล็อกโดยไม่ได้ตั้งใจ จากนั้นมีคำถามเกี่ยวกับโฮโมกลิฟส์ นั่นคือ อักขระต่างๆ ที่มีลักษณะเหมือนกัน ซึ่งอาจขึ้นอยู่กับแบบอักษร เช่น แบบอักษรบางตัวใช้สัญลักษณ์ต่างกันสำหรับอักษรกรีก my และเครื่องหมายจุลภาค บางตัวใช้สัญลักษณ์เดียวกัน ดังนั้น บางคนอาจคิดว่าพวกเขาพิมพ์ my แต่จริง ๆ แล้วพิมพ์ไมโครหรือกลับกัน
bk2204 avatar
fr flag
การพับรหัสผ่านของเคสทำให้ความปลอดภัยแย่ลงอย่างมาก และคุณไม่ควรทำเช่นนั้น นอกจากนี้ เป็นไปไม่ได้ที่จะพับตัวพิมพ์ของข้อความ Unicode อย่างถูกต้องด้วยวิธีที่ไม่คำนึงถึงภาษา IETF มี Unicode Normalization ประเภทอื่นๆ ที่สามารถนำไปใช้กับรหัสผ่านได้ หาก NFC ไม่ตอบสนองความต้องการของคุณที่แก้ไขปัญหาเหล่านี้บางส่วน
in flag
ระวังเกี่ยวกับการทำให้เป็นมาตรฐาน ในแง่หนึ่ง ผู้ใช้อาจไม่ทราบว่า é เวอร์ชันใดที่พวกเขาป้อน ในทางกลับกัน พวกเขาอาจ *รู้* เป็นอย่างดี และคิดว่าตัวจัดการรหัสผ่านจะไม่ทำการเปลี่ยนแปลงรายการของพวกเขา เอกสารอย่างน้อยที่จะใช้การปรับมาตรฐาน
phoenixdown avatar
tr flag
@ bk2204 - RFC ใดที่คุณนึกถึงสำหรับการทำให้เป็นมาตรฐาน Unicode ที่ใช้กับรหัสผ่าน https://datatracker.ietf.org/doc/html/rfc8265 ใช่ไหม
bk2204 avatar
fr flag
ใช่ นั่นคือ RFC
Score:5
ธง gh

ซึ่งจะขึ้นอยู่กับการใช้งานเฉพาะของ KDF ที่คุณใช้อยู่ ฉันไม่ทราบปัญหาใด ๆ ที่ทราบเกี่ยวกับ scrypt (แม้ว่าจะไม่ได้หมายความว่าไม่มีก็ตาม) แต่ก็มีอยู่อย่างแน่นอน ปัญหา ด้วยการใช้งาน PHP ของ Bcrypt ซึ่งการมีอยู่ของไบต์ว่างในอินพุตจะทำให้เกิดปัญหา

ar flag
ฉันอยากจะตำหนิว่าส่วนใหญ่เกี่ยวกับ PHP แต่เมื่อดูอย่างรวดเร็วที่ Wikipedia [แนะนำ](https://en.wikipedia.org/wiki/Bcrypt#Versioning_history) ว่าการจัดการ null ไบต์ใน bcrypt นั้นระบุได้ไม่ดี และฉันจะไม่แปลกใจเลยหากการใช้การอ้างอิง C ดั้งเดิมก็มีข้อผิดพลาดเช่นเดียวกัน (ไม่ว่าในกรณีใด bcrypt ไม่ใช่ KDF จริงๆ แต่เป็นฟังก์ชันการแฮชรหัสผ่าน และค่อนข้างเก่าและล้าสมัยด้วย คุณไม่สามารถใช้มันเพื่อการหาค่าคีย์ได้ อย่างน้อยก็ไม่ใช่เรื่องง่าย และด้วยเหตุนี้ มีทางเลือกอื่นที่ดีกว่า คุณไม่ควรใช้มันเพื่อแฮชรหัสผ่านในปัจจุบันเช่นกัน)
phoenixdown avatar
tr flag
ขอบคุณ @Gh0stFish ฉันสังเกตเห็นในบล็อกโพสต์ว่าผู้เขียนระบุว่า `scrypt` และ `PBKDFv2` ไม่ได้รับผลกระทบจากปัญหาคุณจะแนะนำอะไร ตรวจสอบอินพุตสำหรับไบต์ว่างและลบออกก่อนที่จะส่งไปยัง 'scrypt' หรือไม่ @bk2204 นี่คือสิ่งที่คุณอยากจะแนะนำด้วยหรือไม่?
Gh0stFish avatar
gh flag
@phoenixdown ฉันไม่คิดว่าคุณจำเป็นต้องตัด null bytes ออก คุณเพียงแค่ต้องตรวจสอบว่า *การใช้งาน* เฉพาะที่คุณใช้จัดการอย่างถูกต้อง ตัวอย่างเช่น หากคุณเปรียบเทียบสองสตริง เช่น `foo` และ `foo\0bar` (ด้วยค่าเกลือคงที่) และผลลัพธ์ออกมาเหมือนกัน นั่นแสดงว่าไลบรารี่ที่คุณใช้จัดการ null ไบต์ไม่ถูกต้อง - ซึ่งในกรณีนี้คุณจะต้องลบออก
phoenixdown avatar
tr flag
ขอบคุณ นั่นเป็นความคิดที่ดี ฉันสามารถเพิ่มการทดสอบเพื่อให้แน่ใจว่า `foo` และ `foo\0bar` ไม่ได้ประเมินเป็นผลลัพธ์เดียวกัน และจะล้มเหลวหากเป็นเช่นนั้น

โพสต์คำตอบ

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