PHP Ionic Angularjs Phonegap AJAX Javascript CSS MySQL jQuery Forum

การใช้งาน crypt สำหรับเข้ารหัสข้อมูลรหัสผ่าน

24 September 2015 By


เนื้อหาต่อไปนี้ เป็นแนวทางสำหรับใช้งานการเข้ารหัสข้อมูลที่ต้องการในลักษระ one  way หรือ
ก็คือเข้ารหัสแบบไม่สามารถแปลงกลับได้ คล้ายๆ กับการใช้งาน md5 ,sha1
โดยขออธิบายแยกตามรูปแบบการเข้ารหัสดังนี้
(สามารถเข้าไปศึกษาเพิ่มเติมได้ด้วยตัวเองได้ที่
http://php.net/manual/en/function.crypt.php)


การเข้ารหัสในรุปแบบ 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!";
}
?>
 

Tags:: รหัสผ่าน crypt เข้ารหัส php





URL สำหรับอ้างอิง