ในวิทยาการเข้ารหัสลับ การยืดกุญแจ (อังกฤษ: key stretching) เป็นเทคนิคการทำกุญแจที่อ่อนแอซึ่งปกติจะเป็นรหัสผ่านหรือพาสเฟรซให้มั่นคงยิ่งขึ้นจากการโจมตีด้วยกำลัง โดยเพิ่มเวลาและบางครั้งความจำที่ต้องใช้เมื่อเช็คกุญแจแต่ละตัว รหัสผ่านหรือพาสเฟรซที่มนุษย์สร้างเองมักจะสั้นหรือเดาได้ง่ายจนทำให้เจาะได้ การยืดกุญแจจะทำให้การโจมตีเช่นนี้ยากยิ่งขึ้น และยังอาจเพิ่มความมั่นคงสำหรับแอปที่กุญแจถูกจำกัดขนาด ทำให้เหมือนมีกุญแจที่ยาวกว่าจากมุมมองของผู้โจมตี[1]

มีวิธียืดกุญแจหลายอย่าง วิธีหนึ่งก็คือการใช้ฟังก์ชันแฮชเข้ารหัสลับ (cryptographic hash function) หรือบล็อกไซเฟอร์ (block cipher) โดยทำซ้ำ ๆ เป็นวง ยกตัวอย่างเช่นในไซเฟอร์ที่ใช้กุญแจ อาจจะเปลี่ยนกำหนดรายการกุญแจของไซเฟอร์ให้ทำการเป็นเวลานานตามกำหนด หรือใช้ฟังก์ชันแฮชเข้ารหัสลับที่ต้องใช้ความจำมาก ซึ่งอาจได้ผลกับผู้โจมตีที่มีความจำจำกัด

กระบวนการ

แก้

การยืดกุญแจจะต้องอาศัยขั้นตอนวิธีที่ได้กุญแจดั้งเดิมเป็นอินพุตแล้วใช้ความพยายามมากเพื่อสร้างไซเฟอร์ที่เรียกว่า กุญแจเพิ่มสมรรถนะ (enhanced key)[ต้องการอ้างอิง] เป็นกุญแจที่ยาวกว่าแต่ดูเหมือนกับเป็นเลขสุ่ม ขั้นตอนวิธีการยืดกุญแจนี้จะต้องไม่มีทางลัด ดังนั้น การเปลี่ยนอินพุตให้เป็นไซเฟอร์ที่ดีสุดก็คือการใช้ขั้นตอนวิธีเอง จึงทำให้ผู้โจมตีโดยใช้กำลังต้องใช้ความพยายามมากเท่า ๆ กันสำหรับกุญแจที่ทดลองแต่ละตัว ถ้าความพยายามที่เพิ่มขึ้นเท่ากับการตรวจสอบหากุญแจที่มีขนาดหนึ่งโดยเฉพาะทุก ๆ ตัว ก็จะเรียกได้ว่ากุญแจดั้งเดิมได้ยืดให้ยาวขึ้นเท่ากุญแจขนาดเฉพาะนั้น[1]

การยืดกุญแจจะทำให้ผู้โจมตีมีทางเลือกสองทาง คือ

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

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

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

แบบใช้แฮช

แก้

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

ความแข็งแกร่งและเวลาที่ใช้

แก้

ตัวอย่างต่อไปนี้สมมุติว่าซีพียูที่ผู้บริโภคใช้สามารถคำนวณค่าแฮช SHA-1 ได้ 65,000 ค่า/วินาที ดังนั้น โปรแกรมที่ยืดกุญแจ 65,000 รอบก็จะชะลอผู้ใช้เพียงแค่วินาทีเดียว

ทั่วไปแล้วการทดสอบว่ารหัสผ่านหรือพาสเฟรซถูกต้องหรือไม่ก็จะต้องคำนวณแฮชค่าเดียว แต่ถ้ายืดกุญแจ ผู้โจมตีก็จะต้องคำนวณค่ากุญแจเพิ่มสมรรถภาพสำหรับกุญแจทุกดอกที่ทดลอง ซึ่งหมายความว่าต้องคำนวณค่าแฮช 65,000 ค่า/ตัวกุญแจ ซึ่งเพิ่มงานที่ต้องทำถึง 65,000 เท่า (ราว ๆ 216) ซึ่งก็หมายความว่า กุญแจเพิ่มสมรรถภาพเพิ่มความแข็งแกร่งของกุญแจดั้งเดิมได้ถึง 16 บิต

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

ฟังก์ชันแฮชที่เน้นซีพียูนั้นยังอ่อนแอต่อการโจมตีด้วยฮาร์ดแวร์ที่ออกแบบมาโดยเฉพาะ เช่น มีการทำแฮช SHA-1 ให้เกิดผลโดยใช้ลอจิกเกตเพียง 5,000 ตัวโดยคำนวณได้ภายในรอบนาฬิกา 400 รอบ[3] เอฟพีจีเอเป็นล้าน ๆ ตัวมีราคาไม่เกิน 3,200 บาท[4] ดังนั้น ผู้โจมตีสามารถสร้างเครื่องเจาะรหัสแบบไม่ดำเนินการเป็นวงโดยไม่เกิน 158,000 บาท[ต้องการอ้างอิง] เมื่อใช้สัญญาณนาฬิกาที่ 100 MHz ก็จะสามารถทดสอบกุญแจได้ 300,000 ตัว/วินาที โดยอาจออกแบบสร้างเครื่องตามราคาโดยแลกเปลี่ยนกับความเร็ว เช่น เครื่องที่สามารถเจาะได้ 150,000 ตัว/วินาทีแต่ในราคา 79,000 บาท[ต้องการอ้างอิง] แต่การยืดกุญแจก็ยังชะลอการโจมตีเช่นนี้ได้ เช่น เครื่องที่ทดสอบกุญแจได้ 300,000 ตัว/วินาทีจะทดลองเหลือได้แค่ 300,000÷216 ≈ 4.578 ตัว/วินาที[ต้องการอ้างอิง]

อนึ่ง หน่วยประมวลผลกราฟิกส์ (จีพียู) ที่ผู้บริโภคใช้ปัจจุบันก็สามารถทำให้คำนวณค่าแฮชได้เร็วขึ้นมาก เช่นเมื่อทดสอบ จีพียูรุ่น Nvidia RTX 2080 SUPER FE สามารถคำนวณค่าแฮช SHA1 ได้หมื่นล้านตัว/วินาที[5]

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

ประวัติ

แก้

ฟังก์ชันแปลงรหัสผ่านให้เป็นกุญแจที่ตั้งใจทำให้วิ่งช้าตัวแรกก็คือ crypt (3) ซึ่งนักวิทยาการเข้ารหัสลับชาวอเมริกัน รอเบิร์ต มอร์ริส ได้ทำเพื่อเก็บรหัสผ่านสำหรับระบบปฏิบัติการยูนิกซ์[6] ฟังก์ชันต้องคำนวณ 25 รอบโดยใช้ค่าซอลต์ขนาด 12 บิต และใช้การเข้ารหัสลับที่แปลงจากดีอีเอส ที่ไม่ใช้การเข้ารหัสลับของดีอีเอสโดยตรงก็คือ เพื่อให้เป็นอุปสรรคแก่ฮาร์ดแวร์ที่ใช้เจาะดีอีเอส รหัสผ่านมีตัวอักษรแอสกีได้แค่ 8 ตัว แม้จะเป็นวิธีการที่นำสมัยในเวลานั้น ฟังก์ชัน crypt (3) ปัจจุบันก็ถือว่าใช้ไม่ได้แล้ว เพราะการคำนวณซ้ำซึ่งออกแบบสำรหับงคอมพิวเตอร์สมัย PDP-11 ก็น้อยเกินไป ค่าซอลต์ขนาด 12 บิตเป็นเพียงแต่น่ารำคาญแต่ไม่สามารถป้องกันการโจมตีด้วยพจนานุกรมที่คำนวณค่าแฮชไว้ล่วงหน้าได้จริง 

ฟังก์ชันแปลงรหัสผ่านให้เป็นกุญแจที่ใช้ในปัจจุบัน เช่น PBKDF2 จะใช้ฟังก์ชันแฮชเข้ารหัสลับต่าง ๆ เช่น SHA-2 มีค่าซอลต์ที่ใหญ่กว่า เช่น ขนาด 64 บิต และมีรอบคำนวณที่มากกว่า สถาบันมาตรฐานและเทคโนโลยีแห่งชาติสหรัฐฯ (NIST) แนะนำให้ใช้รอบคำนวณอย่างน้อยที่สุด 10,000 รอบโดยไม่ได้ระบุขั้นตอนวิธียืดกุญแจ[7]: 5.1.1.2  แต่มีคำเตือนเป็นข้อแม้ว่า "สำหรับกุญแจที่สำคัญอย่างวิกฤต หรือสำหรับระบบที่เร็วมาก หรือระบบที่ความรู้สึกว่าวิ่งช้าไม่สำคัญ การคำนวณรอบเป็นสิบล้านรอบอาจจะสมควร"[8]: 5.2 

ปี 2009 เริ่มมีขั้นตอนวิธีการยืดกุญแจที่ใช้ความจำมากคือ scrypt ซึ่งหมายป้องกันการถูกเจาะด้วยฮาร์ดแวร์ที่ออกแบบโดยเฉพาะและทำการขนานได้เป็นอย่างยิ่งเมื่อใช้เจาะกุญแจ[9][10] ในปี 2013 มีการแข่งขันวิธีการแฮชรหัสผ่านเพื่อปรับปรุงมาตรฐานยืดกุญแจให้ทนต่อการโจมตีด้วยจีพียูและฮาร์ดแวร์ที่ออกแบบมาโดยเฉพาะ [11] นักวิทยาการเข้ารหัสลับได้เลือก Argon2 เป็นมาตรฐานในปี 2015 ส่วนสถาบันมาตรฐานและเทคโนโลยีแห่งชาติสหรัฐ (NIST) แนะนำให้ใช้ขั้นตอนวิธี Balloon[12][13]

ตัวอย่างระบบที่มีการยืดกุญแจ

แก้
  • ซอฟต์แวร์เข้ารหัสลับดิสก์บางอย่าง เช่น veracrypt[14]
  • 7-Zip[15]
  • ไฟล์รหัสผ่านของอะแพชี เว็บเซิร์ฟเวอร์ คือ .htpasswd "APR1" และของโอเพนเอสเอสแอล คือ "passwd" ทั้งสองยืดรหัสผ่านด้วยเอ็มดี5 1,000 รอบ
  • โปรแกรมจัดการรหัสผ่านเสรีและโอเพนซอร์ส คีย์พาสและคีย์พาสเอ็กซ์ซี รุ่นปี 2020 ใช้ขั้นตอนวิธียืดกุญแจ Argon2d โดยตั้งค่าเบื้องต้นให้ใช้เวลา 1 วินาที[16][17]
  • ลินุกซ์และระบบคล้ายยูนิกซ์มีทางเลือกเป็นโหมด SHAcrypt ที่คำนวณค่าแฮช SHA256 หรือ SHA512 จำนวน 5,000 รอบเป็นค่าตั้งต้น โดยสามารถตั้งค่าต่ำสุดเป็น 1,000 รอบและสูงสุดเป็น 999,999,999 รอบ[18]
  • โปรแกรมจัดการรหัสผ่านเสรีและโอเพนซอร์ส Password Safe
  • ซอฟต์แวร์เข้ารหัสลับ PGP และ GPG โดยอย่างหลังคำนวณค่าแฮช 65,536 รอบเป็นค่าตั้งต้น[19]
  • โพรโทรคอลการเข้ารหัสลับขอวายฟาย คือ Wi-Fi Protected Access รวมทั้งรุ่น WPA และ WPA2 ในโหมดส่วนตัว (personal mode) คำนวณค่าแฮช PBKDF2 4,096 รอบ ส่วน WPA3 ใช้โพรโทรคอล Simultaneous Authentication of Equals ซึ่งอ้างว่าไม่เปิดเผยค่าแฮชของรหัสผ่าน

ดูเพิ่ม

แก้

อ้างอิง

แก้
  1. 1.0 1.1 1.2 Kelsey, John; Schneier, Bruce; Hall, Chris; Wagner, David A. (1997). "Secure Applications of Low-Entropy Keys". ใน Okamoto, Eiji; Davida, George I.; Mambo, Masahiro (บ.ก.). Information Security, First International Workshop, ISW '97, Tatsunokuchi, Japan, September 17-19, 1997, Proceedings. Lecture Notes in Computer Science. Vol. 1396. Springer. pp. 121–134. doi:10.1007/BFb0030415. ISBN 978-3-540-64382-1.
  2. McMillan, Troy (2022-07-07). CompTIA Advanced Security Practitioner (CASP+) CAS-004 Cert Guide (ภาษาอังกฤษ). Pearson IT Certification. ISBN 978-0-13-734870-1.
  3. O'Neill, Máire. "Low-cost SHA-1 Hash Function Architecture for RFID Tags" (PDF). คลังข้อมูลเก่าเก็บจากแหล่งเดิม (PDF)เมื่อ 2012-03-19.
  4. "New 90nm Xilinx Spartan-3 FPGAs Reshape Semiconductor Landscape (0333) : Xilinx Press Releases". คลังข้อมูลเก่าเก็บจากแหล่งเดิมเมื่อ 2011-07-16. สืบค้นเมื่อ 2010-08-08.
  5. https://gist.github.com/epixoip/47098d25f171ec1808b519615be1b90d , PBKDF2-HMAC-SHA1 with 1,000 iterations costs 2,002 SHA-1 hashes at a speed of 5,164.9 kH/s which comes to 10,340,129,800 SHA-1 hashes per second.
  6. Morris, Robert; Thompson, Ken (1978-04-03). "Password Security: A Case History". Bell Laboratories. คลังข้อมูลเก่าเก็บจากแหล่งเดิมเมื่อ 2003-03-22. สืบค้นเมื่อ 2011-05-09.
  7. Grassi, Paul A. (June 2017). SP 800-63B-3 - Digital Identity Guidelines, Authentication and Lifecycle Management. NIST. doi:10.6028/NIST.SP.800-63b.
  8. Turan, Meltem Sönmez; Barker, Elaine; Burr, William; Chen, Lily (December 2010). SP 800-132 - Recommendation for Password-Based Key Derivation, Part 1: Storage Applications. NIST. doi:10.6028/NIST.SP.800-132.{{cite book}}: CS1 maint: multiple names: authors list (ลิงก์)
  9. Scrypt
  10. scrypt: A new key derivation function, Colin Percival, BSDCan 2009, accessed 2011-2-1
  11. "Password Hashing Competition". คลังข้อมูลเก่าเก็บจากแหล่งเดิมเมื่อ 2013-09-02. สืบค้นเมื่อ 2013-03-03.
  12. "NIST SP800-63B Section 5.1.1.2" (PDF). nvlpubs.nist.gov.
  13. Password Hashing Competition
  14. "Free Open source disk encryption with strong security for the Paranoid". VeraCrypt. เก็บจากแหล่งเดิมเมื่อ 2024-06-07. สืบค้นเมื่อ 2024-06-29.
  15. "7z Format".
  16. KBDF 4
  17. KeePassXC—Creating Your First Database
  18. Drepper, Ulrich. "Unix crypt using SHA-256 and SHA-512".
  19. RFC 4880