เนื้อหาต่อไปนี้ เป็นแนวทางสำหรับใช้งานการเข้ารหัสข้อมูลที่ต้องการในลักษระ one way หรือ
ก็คือเข้ารหัสแบบไม่สามารถแปลงกลับได้ คล้ายๆ กับการใช้งาน md5 ,sha1
โดยขออธิบายแยกตามรูปแบบการเข้ารหัสดังนี้
(สามารถเข้าไปศึกษาเพิ่มเติมได้ด้วยตัวเองได้ที่
การเข้ารหัสในรุปแบบ Standard DES
จะสร้างการเข้ารหัสโดย กำหนด salt string ได้ 2 ตัวอักษร
จากตัวอักษร "./0-9A-Za-z"
จุด (.) เครืองหมาย / ตัวเลข 0-9 ตัวอักษรภาษาอังกฤษ ทั้งตัวเล็ก หรือตัวใหญ่
(salt string คือ ข้อความเสริมใช้ผสมเข้าไปสำหรับเข้ารหัส)
echo crypt('123456789', 'dd');
ในรูปแบบนี้ ถ้าข้อความที่เข้ารหัส มีความยาวมากกว่า 8
เช่น 123456789 การเข้ารหัสจะตัดเอาเฉพาะ 8 ตัวแรกมาใช้ในการเข้ารหัส
ดังนั้น ถ้าข้อความที่ต้องการเข้ารหัสที่มีความยาวมากๆ ตั้งแต่ 9 ค่าขึ้นไป
ถ้าอักษร 8 ตัวแรกเหมือนกัน จะทำให้ค่าที่ได้จากการเข้ารหัส มีค่าเท่ากัน
เมื่อใช้ salt เดียวกันด้วย
if(CRYPT_STD_DES == 1) { // ถ้ารองรับการเข้ารหัสแบบ Standard DES echo 'Standard DES: ' ."<br>" . crypt('123456789', 'dd') ."<br>" . crypt('123456788755', 'dd') . "<br>"; }
จะได้ค่าการเข้ารหัสของทั้งสอง มีค่าเท่ากัน คือ
ddN29Q7Yq3xeA
ตัวอักษร 2 ตัวแรกจะเป้นค่า salt ที่เรากำหนด จากตัวอย่างก็คือ dd
ค่าความยาวของข้อความที่ได้จากการเข้ารหัสเท่ากับ 13
การเข้ารหัสในรุปแบบ Extended DES
จะสร้างการเข้ารหัสโดย กำหนด salt string ได้ 9 ตัวอักษร
โดยใน salt 9 ตัวประกอบด้วยเครื่องหมาย _ (underscore)
ตามด้วย salt อีก 8 ตัวอักษร
echo crypt('123456', '_J8..abcd'); if (CRYPT_EXT_DES == 1) { // ถ้ารองรับการเข้ารหัสแบบ Extended DES echo 'Extended DES: ' . crypt('123456', '_J8..abcd') ."<br>length: ".strlen(crypt('123456', '_J8..abcd')) . "<br>"; }
จะได้ค่าการเข้ารหัส
_J0..abcdbbK5ZeEtXOQ
ตัวอักษร 9 ตัวแรกจะเป้นค่า salt
ความยาวของข้อความที่เข้ารหัสแล้วเท่ากับ 20
การเข้ารหัสในรุปแบบ MD5
จะสร้างการเข้ารหัสโดย กำหนด salt string ได้ 12 ตัวอักษร
โดยเริ่มต้น salt ด้วย $1$ ด้วย
echo crypt('12345678', '$1$abcdefgh$'); if (CRYPT_MD5 == 1) { // ถ้ารองรับการเข้ารหัสแบบ MD5 echo 'MD5: ' . crypt('12345678', '$1$abcdefgh$') ."<br>length: ".strlen(crypt('12345678', '$1$abcdefgh$')) . "<br>"; }
จะได้ค่าการเข้ารหัส
_J0..abcdbbK5ZeEtXOQ
ตัวอักษร 12 ตัวแรกจะเป้นค่า salt
ความยาวของข้อความที่เข้ารหัสแล้วเท่ากับ 34
การเข้ารหัสในรุปแบบ Blowfish
จะสร้างการเข้ารหัสโดย
เริ่มต้นด้วย "$2a$" หรือ ( "$2x$" หรือ "$2y$" [PHP >=5.3.7])
ต่อด้วยช่วงข้อความตัวเลข 04-31
ต่อด้วยเครื่องหมาย $
และต่อด้วยข้อความ salt อีก 22 ตัว
$2a$04$123456789123456789123$
แยกได้เป็น
$2a$ 04 $ 123456789123456789123$
echo crypt('12345678', '$2a$04$123456789123456789123$'); if (CRYPT_BLOWFISH == 1) { // ถ้ารองรับการเข้ารหัสแบบ Blowfish echo 'Blowfish: ' . crypt('12345678', '$2a$04$123456789123456789123$') ."<br>length: ".strlen(crypt('12345678', '$2a$04$123456789123456789123$')) . "<br>"; }
จะได้ค่าการเข้ารหัส
$2a$04$123456789123456789123.KpAv6rKQXMV21Am7jhYtyMrw3YmHRaK
ความยาวของข้อความที่เข้ารหัสแล้วเท่ากับ 60
การเข้ารหัสในรุปแบบ SHA-256 (PHP >=5.3.2)
จะสร้างการเข้ารหัสโดย
เริ่มต้น salt ด้วย "$5$"
ต่อด้วย rounds=5000$ [5000 ค่าการวนลูปของ hash น้ยอสุด 1000 สูงสุด 999,999,999]
และต่อด้วยข้อความ salt อีก 16 ตัว
$5$rounds=5000$123456789123456$
แยกได้เป็น
$5$ rounds=5000$ 123456789123456$
echo crypt('12345678', '$5$rounds=5000$123456789123456$'); if (CRYPT_SHA256 == 1) { // ถ้ารองรับการเข้ารหัสแบบ SHA-256 echo 'SHA-256: ' . crypt('12345678', '$5$rounds=5000$123456789123456$') ."<br>length: ".strlen(crypt('12345678', '$5$rounds=5000$123456789123456$')) . "<br>"; }
จะได้ค่าการเข้ารหัส
$5$rounds=5000$123456789123456$IBTbJzyFELhm/Z.gwlVW2zgEcHxvMzXg/.IMtOeRn89
ความยาวของข้อความที่เข้ารหัสแล้วประมาณ 75 ตัวอักษร
การเข้ารหัสในรุปแบบ SHA-512 (PHP >=5.3.2)
จะสร้างการเข้ารหัสโดย
เริ่มต้น salt ด้วย "$6$"
ต่อด้วย rounds=5000$ [5000 ค่าการวนลูปของ hash น้ยอสุด 1000 สูงสุด 999,999,999]
และต่อด้วยข้อความ salt อีก 16 ตัว
$6$rounds=5000$123456789123456$
แยกได้เป็น
$6$ rounds=5000$ 123456789123456$
echo crypt('12345678', '$6$rounds=5000$123456789123456$'); if (CRYPT_SHA512 == 1) { // ถ้ารองรับการเข้ารหัสแบบ SHA-512 echo 'SHA-512: ' . crypt('12345678', '$6$rounds=5000$123456789123456$') ."<br>length: ".strlen(crypt('12345678', '$6$rounds=5000$123456789123456$')) . "<br>"; }
จะได้ค่าการเข้ารหัส
$6$rounds=5000$123456789123456$qElISCVM48vPoWrlI8PRstO4.fmtbH/D. IYrjWVIDNJY.HCFzqduH/AeIy/Zm3D8cSU69fmJktnpt3iZVQtta1
ความยาวของข้อความที่เข้ารหัสแล้วประมาณ 118 ตัวอักษร
วิธีการตรวจสอบ crypt
สมมติเงื่อนไขของเราคือ ใช้ การเข้ารหัสในรูปแบบ Blowfish
โดยทำการเข้ารหัสรหัสผ่านของผู้ใช้ และบันทึกค่าที่ได้ลงในฐานข้อมูล
รหัสผ่านก่อนบันทึกลงฐานข้อมูลคือ 12345678
salt การเข้ารหัสแบบ Blowfish เท่ากับ $2a$04$123456789123456789123$
การเข้ารหัสก่อนบันทึกลงฐานข้อมูล
$password = 12345678; $salt = '$2a$04$123456789123456789123$'; $hashed_password = crypt($password, $salt);
เราจะได้ตัวแปร $hashed_password สำหรับบันทึกลงฐานข้อมูล
ในขั้นตอนการตรวจสอบก็สามารถทำได้ดังนี้
$salt = '$2a$04$123456789123456789123$'; $hashed_password = crypt($_POST['input_password'], $salt); $sql=" SELECT user_id,user_name FROM user WHERE username='".trim($_POST['input_username'])."' AND password='".$hashed_password."' ";
นอกจากนั้น เราสามารถประยุกต์การเข้ารหัสผ่าน เพื่อใช้งาน
อย่างง่ายกรณีไม่ได้ใช้งานฐานข้อมูล เช่น
สมมติเรามีระบบจัดการรายการอยู่หน้าหนึ่ง มี admin คนเดียว
เก็บรหัสแบบเข้ารหัสด้วยคำสั่ง
<?php $salt = '$2a$04$123456789123456789123$'; echo $hashed_password = crypt($password, $salt) ?>
พอได้รหัสผ่านที่เข้ารหัสแล้ว เราก็เอาค่านั้นไปเก็บเป็นตัวแปรในไฟล์ที่เราจะใช้
เช่น
<?php $salt = '$2a$04$123456789123456789123$'; $hashed_password = "$2a$04$123456789123456789123.KpAv6rKQXMV21Am7jhYtyMrw3YmHRaK"; // ตรวจสอบเมื่อผู้ใช้ส่งตัวแปรจากฟอร์มมาตรวจสอบ if(hash_equals($hashed_password, crypt($_POST['input_password'], $salt))) { echo "Password verified!"; } ?>