Bcrypt: Password Hashing

🔑 Bcrypt คืออะไร? มาตรฐานการแฮชรหัสผ่านที่ปลอดภัยที่สุด

ในโลกของการพัฒนาแอปพลิเคชัน ความปลอดภัยของข้อมูลผู้ใช้ถือเป็นหัวใจสำคัญที่สุด โดยเฉพาะอย่างยิ่ง ‘รหัสผ่าน’ ซึ่งเป็นข้อมูลที่ละเอียดอ่อนที่สุด Bcrypt คืออัลกอริทึมการเข้ารหัส (Cryptographic Hashing Algorithm) ที่ถูกออกแบบมาโดยเฉพาะเพื่อวัตถุประสงค์ในการแฮชรหัสผ่าน (Password Hashing) โดยมีเป้าหมายหลักคือการทำให้กระบวนการแฮชมีความช้า (Slow Hashing) เพื่อป้องกันการโจมตีแบบ Brute-force และ Dictionary Attack ได้อย่างมีประสิทธิภาพ

Bcrypt ไม่ใช่การเข้ารหัส (Encryption) ที่สามารถถอดรหัสกลับได้ แต่เป็นฟังก์ชันทางเดียว (One-way Function) ซึ่งหมายความว่าเมื่อคุณแฮชรหัสผ่านแล้ว จะไม่สามารถย้อนกลับไปเป็นรหัสผ่านต้นฉบับได้ นี่คือหลักการพื้นฐานที่ทำให้มันปลอดภัยกว่าการใช้ฟังก์ชันแฮชแบบดั้งเดิมอย่าง SHA-256 หรือ MD5

⚙️ หลักการทำงานและจุดเด่นทางสถาปัตยกรรมของ Bcrypt

ความแข็งแกร่งของ Bcrypt มาจากองค์ประกอบหลัก 3 ส่วนที่นักพัฒนาต้องเข้าใจ:

  1. Salt (ค่าเกลือ): Bcrypt จะมีการสร้างค่า Salt แบบสุ่มและผูกติดไปกับค่า Hash เสมอ การทำเช่นนี้ทำให้แม้ว่าผู้ใช้สองคนจะมีรหัสผ่านเดียวกัน แต่ค่า Hash ที่ได้จะแตกต่างกันโดยสิ้นเชิง ป้องกันการใช้ Rainbow Table Attack ได้อย่างสมบูรณ์
  2. Cost Factor (ค่าความยาก): นี่คือจุดเด่นที่สำคัญที่สุด Bcrypt อนุญาตให้เรากำหนด ‘จำนวนรอบ’ (Iteration Count) ในการคำนวณแฮชได้ ยิ่งเราเพิ่มค่า Cost Factor เท่าไหร่ การคำนวณก็จะยิ่งใช้เวลานานขึ้น ซึ่งเป็นการเพิ่มภาระให้กับผู้โจมตีที่พยายามเดารหัสผ่าน ทำให้ความปลอดภัยสูงขึ้นตามเวลาที่ผ่านไป
  3. One-way Function: ย้ำอีกครั้งว่า Bcrypt เป็นการแฮชทางเดียว ทำให้แม้ผู้โจมตีจะได้ค่า Hash ไป ก็ไม่สามารถหา Password ต้นฉบับกลับมาได้

💾 การใช้งาน Bcrypt ใน PostgreSQL: Best Practice

ในทางปฏิบัติ เมื่อเราใช้ PostgreSQL ในการเก็บรหัสผ่าน เราไม่ควรเก็บรหัสผ่านแบบ Plain Text อย่างเด็ดขาด แต่ต้องทำการแฮชก่อนบันทึกเสมอ แม้ว่า PostgreSQL จะไม่ได้มีฟังก์ชัน `bcrypt()` ติดมาให้โดยตรง แต่ในระดับสถาปัตยกรรม เราจะต้องใช้ฟังก์ชันหรือ Extension ที่รองรับการแฮชที่ซับซ้อนเช่นนี้

ขั้นตอนการแฮชและการตรวจสอบรหัสผ่าน

สมมติว่าเรามีฟังก์ชันที่ชื่อว่า `bcrypt_hash(password, cost_factor)` สำหรับการแฮช และฟังก์ชัน `bcrypt_compare(password, stored_hash)` สำหรับการตรวจสอบ:

SQL

-- 1. การลงทะเบียนผู้ใช้ใหม่ (Hashing Password) --
-- สมมติว่าเราใช้ Cost Factor = 12
INSERT INTO users (username, password_hash) VALUES 
('john_doe', bcrypt_hash('mysecretpassword', 12));

-- 2. การตรวจสอบรหัสผ่านเมื่อผู้ใช้ล็อกอิน --
-- แทนที่จะเปรียบเทียบรหัสผ่านโดยตรง เราใช้ฟังก์ชันเปรียบเทียบ
SELECT user_id FROM users WHERE 
bcrypt_compare('mysecretpassword', password_hash) = TRUE;

คำอธิบาย: เมื่อผู้ใช้พยายามล็อกอิน ระบบจะนำรหัสผ่านที่ผู้ใช้ป้อนเข้ามา (เช่น ‘mysecretpassword’) ไปเปรียบเทียบกับค่า Hash ที่เก็บไว้ในฐานข้อมูลโดยใช้ฟังก์ชัน `bcrypt_compare()` ซึ่งฟังก์ชันนี้จะทำการคำนวณแฮชด้วย Cost Factor เดียวกันกับที่ใช้ในการเก็บค่า Hash เพื่อให้มั่นใจว่าการตรวจสอบนั้นถูกต้องและปลอดภัยที่สุด

✅ บทสรุป: ทำไมต้อง Bcrypt?

การเลือกใช้ Bcrypt ในการจัดการรหัสผ่านถือเป็นการยกระดับความปลอดภัยของระบบให้เป็นไปตามมาตรฐานสากล การที่ Bcrypt มีกลไกของ Salt และ Cost Factor ทำให้มันทนทานต่อการโจมตีที่พัฒนาขึ้นใหม่ ๆ ได้อย่างดีเยี่ยม ดังนั้น ในฐานะ Senior Architect การใช้ Bcrypt ในการจัดเก็บรหัสผ่านใน PostgreSQL จึงเป็นแนวทางปฏิบัติที่ดีที่สุด (Best Practice) ที่ไม่ควรมองข้าม เพื่อปกป้องข้อมูลสำคัญของผู้ใช้ของคุณอย่างแท้จริง