การเข้ารหัสและการจัดเก็บรหัสผ่านอย่างปลอดภัย ด้วย Bcrypt

Bcrypt เป็นฟังก์ชั่นการเข้ารหัสแบบ Hash ที่มีความปลอดภัยสูงเนื่องจากมีการเพิ่มเติมอัลกอริทึมการเข้ารหัสที่ทำให้การทำ Brute-force มีความยากขึ้น และยังสามารถป้องกันการทำ Rainbow Table ได้ด้วย

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

Bcrypt จะมีการกำหนดระดับความปลอดภัย (Security Level) โดยเรียกว่า Cost factor ซึ่งจะมีค่าเริ่มต้นอยู่ที่ 10 เมื่อมีการเพิ่มระดับความปลอดภัยให้สูงขึ้น จะทำให้การคำนวณ Key และ Salt ใช้เวลานานขึ้น และจะทำให้การ Brute-force ใช้เวลานานขึ้นด้วย

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

กระบวนการเข้ารหัสแบบ Bcrypt ประกอบด้วยขั้นตอนดังนี้
  1. Bcrypt จะสุ่มค่า Salt ขึ้นมาเพื่อเพิ่มความซับซ้อนให้กับการเข้ารหัส โดย Salt จะเป็นข้อมูลที่ไม่ซ้ำกันและมีความยาวต่างกันไปตามการตั้งค่าของ Bcrypt ซึ่งค่า Salt จะถูกเก็บรวมกับรหัสผ่านที่ถูกเข้ารหัสแล้ว
  2. Bcrypt จะใช้ฟังก์ชัน Hashing เพื่อคำนวณค่า Hash จากการนำรหัสผ่านที่ต้องการเข้ารหัส มาผ่านการ Hash ในรอบแรก โดยใช้ Salt ที่ถูกสุ่มมาเพื่อสร้าง Key ในการเข้ารหัส และผลลัพธ์ที่ได้จะเป็นค่า Hash ที่จะถูกนำไปใช้ในการเข้ารหัสในรอบถัดไป
  3. หลังจากได้ Hash มาแล้ว Bcrypt จะนำ Key ที่ถูกสร้างขึ้นจาก Salt มาใช้ในการเข้ารหัสด้วย Blowfish cipher โดยการแบ่งชุดข้อมูลออกเป็น Block ขนาด 64-bit และทำการเข้ารหัสแบบ Blowfish cipher โดยใช้ Key ที่สร้างขึ้นมา
  4. และสุดท้าย จะมีการทำซ้ำ โดยการนำค่า Hash ที่ได้มา สุ่ม Salt ขึ้นมาใหม่ และทำการเข้ารหัสซ้ำด้วย Salt ใหม่ตามจำนวนรอบที่กำหนด เพื่อให้ Hash ที่ได้มีความปลอดภัยและยากต่อการถอดรหัสมากขึ้น

กระบวนการถอดรหัส (Decryption) ใน Bcrypt ไม่สามารถทำได้ เนื่องจากเป็นการเข้ารหัสแบบ One-way Hash Function ซึ่งไม่มีวิธีที่จะถอดรหัสกลับมาเป็นข้อมูลเดิมได้ ดังนั้นเราจะไม่สามารถกู้คืนรหัสผ่านจาก Hash ที่ได้รับมาได้โดยตรง
วิธีตรวจสอบรหัสผ่านใน Bcrypt คือการสร้าง Hash ของรหัสผ่านที่เราต้องการตรวจสอบ โดยใช้ Salt และการทำซ้ำที่กำหนดไว้ในการเข้ารหัส Bcrypt จากนั้นนำ Hash ที่ได้มาเปรียบเทียบกันหากตรงกันแสดงว่ารหัสผ่านที่ต้องการตรวจสอบถูกต้อง
  1. ดึง salt ออกมาจากรหัสผ่านที่ถูกเข้ารหัสในรูปแบบ Bcrypt โดย salt จะอยู่ในตำแหน่งแรกของรหัสผ่านที่ถูกเข้ารหัส
  2. นำ salt มาผ่านฟังก์ชัน crypt() เพื่อสร้างรหัสผ่านใหม่โดยใช้ salt เดิม และส่วนเหลือของรหัสผ่านที่ไม่ได้เป็น salt แล้ว
  3. เปรียบเทียบรหัสผ่านที่ผู้ใช้ป้อนเข้ากับรหัสผ่านใหม่ที่ได้จากฟังก์ชัน crypt() ถ้าตรงกันฟังก์ชันจะส่งค่า true ออกมา

ใน PHP สามารถใช้งาน Bcrypt ได้โดยใช้ฟังก์ชัน password_hash() เพื่อเข้ารหัสรหัสผ่านและฟังก์ชัน password_verify() เพื่อตรวจสอบรหัสผ่านว่าถูกต้องหรือไม่ โดยมีการใช้งานเบื้องต้นดังนี้

การเข้ารหัส
// รหัสผ่านของผู้ใช้ที่ต้องการเข้ารหัส
$password = 'abc1234';
// เข้ารหัส
$hashed_password = password_hash($password, PASSWORD_BCRYPT);

เราสามารถจัดเก็บ $hashed_password ไว้ในฐานข้อมูลแทนการจัดเก็บ Password และในการเรียกฟังก์ชั่นในแต่ละครั้งจะไม่ได้ Hash ในค่าเดิม ซึ่งจะทำให้ไม่สามารถใช้ Rainbow Table ได้

การตรวจสอบความถูกต้องของรหัสผ่าน
// รหัสผ่านของผู้ใช้ที่ต้องดารตรวจสอบ
$password = 'abc1234';
// ค่า Hash ที่ได้จากการเข้ารหัสแล้ว (จัดเก็บไว้ในฐานข้อมูล)
$hashed_password = '$2y$10$aoPAdF5pxST1hB2UhhsYW.69/CbijJMn4Jl/4n3R23IQXLZvDA9uO';
// ตรวจสอบรหัสผ่าน
if (password_verify($password, $hashed_password)) {
    // รหัสผ่านถูกต้อง
    echo 'Password is valid!';
} else {
    // รหัสผ่านไม่ถูกต้อง
    echo 'Invalid password.';
}

ในตัวอย่าง ค่า PASSWORD_BCRYPT ใน password_hash() จะใช้ในการกำหนดวิธีการเข้ารหัสซึ่งในกรณีนี้คือ Bcrypt และค่าความแข็งแรงของ Hash จะถูกกำหนดเป็นค่าเริ่มต้นเท่ากับ 10 (y$10 ในค่า Hash)
^