พ.ร.บ. คุ้มครองข้อมูลส่วนบุคคล (PDPA) ของไทยกำหนดให้ผู้ควบคุมข้อมูลใช้ "มาตรการความปลอดภัยที่เหมาะสม" โดยไม่ได้ระบุอัลกอริทึมเฉพาะ ทำให้การเลือกใช้งานจริงตกอยู่กับทีมพัฒนา ด้วยการเติบโตของฟินเทคและกระเป๋าเงินดิจิทัลในไทยที่ฐานผู้ใช้ใหญ่ขึ้นเรื่อย ๆ Argon2 ซึ่งชนะการแข่งขัน Password Hashing Competition ปี 2015 และได้รับคำแนะนำจาก OWASP ให้ใช้ก่อน bcrypt จึงกลายเป็นตัวเลือกเริ่มต้นที่สมเหตุสมผลสำหรับระบบยืนยันตัวตนใหม่ ๆ โดยมีให้ใช้งานพร้อมในฟังก์ชัน password_hash() ของ PHP
ทำไมหน่วยความจำสำคัญพอ ๆ กับเวลา
Bcrypt และ PBKDF2 ทำได้แค่ทำให้การคำนวณช้าลง แต่ Argon2 บังคับให้ทุกความพยายามต้องจองหน่วยความจำ RAM ในปริมาณที่ปรับได้ — นี่คือสิ่งที่เรียกว่าฟังก์ชัน memory-hard ฟาร์ม GPU ที่เช่าบนคลาวด์สามารถทำการประมวลผลแบบขนานของการคำนวณง่าย ๆ ได้ในราคาถูก แต่การทำการเข้าถึงหน่วยความจำจำนวนมากพร้อมกันแบบขนานนั้นแพงกว่ามาก เพราะหน่วยความจำถูกจำกัดทางกายภาพต่อการ์ดหนึ่งใบ ต่างจากแกนประมวลผล
สามรูปแบบ: d, i, id
- Argon2d — การเข้าถึงหน่วยความจำขึ้นอยู่กับรหัสผ่านเอง ให้ความต้านทาน GPU สูงสุด แต่ในทางทฤษฎีอาจเปิดช่องให้โจมตีแบบ side-channel
- Argon2i — การเข้าถึงหน่วยความจำไม่ขึ้นกับรหัสผ่าน ปิดช่องโหว่นั้นได้ แลกกับความต้านทาน GPU ที่ลดลงเล็กน้อย
- Argon2id — ผสมทั้งสองกลยุทธ์ในขั้นตอนต่างกันของการคำนวณ เป็นรูปแบบที่ RFC 9106 แนะนำ และเป็นค่าเริ่มต้นในเฟรมเวิร์กส่วนใหญ่
สามพารามิเตอร์อิสระ
ต่างจาก "cost factor" ตัวเดียวของ bcrypt, Argon2 ให้ปรับหน่วยความจำ จำนวนรอบวนซ้ำ และความขนานแยกจากกันได้ ซึ่งมีประโยชน์ในทางปฏิบัติ: ฟังก์ชัน serverless ที่มีหน่วยความจำจำกัดสามารถชดเชยด้วยการเพิ่มจำนวนรอบวนซ้ำ ในขณะที่เซิร์ฟเวอร์ยืนยันตัวตนเฉพาะที่มี RAM เหลือเฟือสามารถทำตรงกันข้ามได้
ทำไมต้องใช้สิ่งนี้
- เลือกอัลกอริทึมที่ทันสมัยสำหรับระบบยืนยันตัวตนใหม่ แทน MD5 หรือ SHA-256 ธรรมดา
- เข้าใจว่าทำไม Argon2 จึงทำให้การโจมตีด้วย GPU ที่เช่ามาหรือฮาร์ดแวร์ขุดคริปโตมีต้นทุนสูงขึ้นโดยเฉพาะ
- วางแผนการย้ายจาก bcrypt หรือ PBKDF2 ในฐานะส่วนหนึ่งของการตรวจสอบความปลอดภัย
กับดักของพารามิเตอร์ความขนาน
ความขนานดูเหมือนผลประโยชน์ฟรี — เธรดยิ่งเยอะ การแฮชยิ่งเร็วบนเซิร์ฟเวอร์หลายคอร์ แต่ผู้โจมตีที่มีฮาร์ดแวร์หลายคอร์แบบเดียวกันก็ได้รับความเร็วที่เพิ่มขึ้นเท่ากันในทุกความพยายาม การตั้งค่าความขนานให้ตรงกับจำนวนคอร์จริงของเซิร์ฟเวอร์นั้นปลอดภัย ส่วนการเพิ่มมันไว้ "เผื่อเหลือเผื่อขาด" มีแต่จะมอบส่วนลดตามสัดส่วนให้ผู้โจมตี