PHP Ionic Angular Phonegap AJAX Javascript CSS MySQL jQuery Forum


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

24 September 2015 By
รหัสผ่าน crypt เข้ารหัส php

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ รหัสผ่าน crypt เข้ารหัส php



เนื้อหาต่อไปนี้ เป็นแนวทางสำหรับใช้งานการเข้ารหัสข้อมูลที่ต้องการในลักษระ 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:: php crypt เข้ารหัส รหัสผ่าน






อย่าลืมกด Like กด Share เป็นกำลังใจ ในการสร้างบทความใหม่ๆ น่ะครับ


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