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