Score:6

การเข้ารหัสเกลือเป็นเลขฐานสิบหกก่อนที่จะแฮชการปฏิบัติที่ไม่ดี?

ธง in

ฉันกำลังอ่านคำถามเกี่ยวกับคีย์สมมาตร ที่นี่ และพบคำตอบที่น่าสนใจทีเดียว มันกล่าวถึง:

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

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

Patrick Favre avatar
us flag
ธีมหลักที่นี่คือเมื่อคุณทำการเข้ารหัส (ไม่ว่าจะเป็นรูปแบบใด เช่น hex, base64) อย่าลืมถอดรหัสก่อนใช้งานและไม่ใช้การแทนค่าไบต์ ASCII ของสตริงการเข้ารหัส แบบดั้งเดิมของการเข้ารหัสมักได้รับการปรับให้เหมาะสมสำหรับความยาวเฉพาะของคีย์หรือเกลือ ดังนั้นหากคุณป้อนความยาวที่ไม่ถูกต้อง พวกเขามักจะถูกแฮช ซึ่งอาจเพิ่มความเสี่ยงของการชนกัน
Score:17
ธง in

นี่ไม่ได้พูดถึงเกลือเลย แต่เกี่ยวกับคีย์สมมาตรจริง ๆ อ้างวรรคเต็ม:

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

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

เหตุผลนี้ง่ายมาก:

  • 32 ไบต์ดิบคือ 256^32 คีย์ที่เป็นไปได้
  • 32 ไบต์ของข้อมูลเลขฐานสิบหกคือ 16^32 คีย์ที่เป็นไปได้

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

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

Maarten Bodewes avatar
in flag
สตริงอาจทำลายได้ยากขึ้น พวกมันอาจได้รับการ "ทำให้เป็นภายใน" เช่น จะถูกเก็บไว้ตลอดอายุการใช้งานของเครื่อง
A Tea Kettle avatar
in flag
ขอบคุณสำหรับคำอธิบายที่ดี!
Ben avatar
tr flag
Ben
ฉันไม่เข้าใจว่า 32 ไบต์ดิบแตกต่างจาก 32 ไบต์อย่างไร ตามคำอธิบายของคุณ อักขระฐานสิบหกหนึ่งตัวถูกจัดเก็บเป็นไบต์ แต่นั่นไม่ใช่เรื่องปกติ ควรมีเลขฐานสิบหกสองหลักต่อไบต์ซึ่งจะเท่ากับ 8 บิตและค่าที่เป็นไปได้ทั้งหมด 256 ค่า
Marc avatar
in flag
เลขฐานสิบหกสองหลักแทนหนึ่งไบต์ได้ แต่ถ้าคุณมีสตริงของการแทนเลขฐานสิบหกนี้ ไบต์เดียวของสตริงดังกล่าวจะเป็นเพียงหนึ่งอักขระ นี่เป็นข้อผิดพลาดทั่วไปที่ผู้คนมักทำ: ใช้ 32 ไบต์แรกของการแสดงข้อมูลดิบที่เป็นเลขฐานสิบหกโดยไม่รู้ว่ากำลังลดลงครึ่งหนึ่ง
Patrick Favre avatar
us flag
@marc คำตอบที่ดี แต่ฉันยอมรับว่าคำอธิบายของ 32 hex bytes นั้นสร้างความสับสน: ทำไมไม่ "32 ตัวอักษร (ซึ่งต้องการ 32 ไบต์) ของข้อมูลเลขฐานสิบหกคือ `16^32` คีย์ที่เป็นไปได้"
Score:3
ธง my

ใครสามารถอธิบายว่าทำไมสิ่งนี้ถึงไม่ดี?

ใครบอกว่าการเข้ารหัสเกลือก่อนการแฮชนั้นไม่ดี? เมื่อ Tim McLean เขียน:

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

เขากำลังพูดถึงการสร้างกุญแจสำหรับรหัสสมมาตรโดยเฉพาะ เขาไม่ได้พูดถึงการสร้างภาพที่จะแฮช

เมื่อคุณสร้างเกลือสำหรับแฮช ไม่มีอะไรผิดปกติกับการใช้การเข้ารหัสฐานสิบหก

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

โพสต์คำตอบ

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