Pages

4/05/2012

การเข้ารหัส php แบบปลอดภัยและตัวอย่าง encode php อย่างง่าย สำหรับกันนำไปใช้ต่อ

การเข้ารหัสผ่านปัจจุบัน
   การเข้ารหัสผ่านปัจจุบัน ในภาษา php นั้น นิยมใช้ function md5() เพราะว่า function นี้เป็น function ในการเข้ารหัสทางเดียว ไม่สามารถถอดได้ จึงทำให้เกิดความปลอดภัยในการเข้ารหัสสูงมาก

เข้ารหัสผ่านอย่างไรให้ปลอดภัย
  หลาย ๆ ท่านอ่านบทความข้างบนแล้ว อาจจะเดาได้บ้างแล้ว ว่าจะทำอย่างไร ?
เทคนิคของนาย xvlnw ก็ไม่มีอะไรมาก อาจจะอยู่ที่ปลายจมูกซะด้วยซ้ำ (มองไม่เห็น ทั้ง ๆ ที่อยู่ใกล้ ๆ แค่นี้เอง) นั่นก็คือ การเข้ารหัสซ้อน ๆ กันหลาย ๆ ชั้น และใช้หลาย ๆ function ในการเข้ารหัส

เช่น  ตัวอย่างการใช้ md5() 3 ชั้น

โค๊ด:
echo md5(md5(md5("password")));

แล้วถ้าแบบนี้หละ เอา function การเข้ารหัสแบบอื่นเข้ามาใช้งานด้วย จะเกิดอะไรขึ้น

โค๊ด:
echo  md5(base64_encode(md5(md5("password"))));

หรือมากไปกว่านั้น php ยังมี function การเข้ารหัสผ่านแบบทางเดียว ที่เหมือน md5() อีกอันนั่นคือ sha1() 

โค๊ด:
echo md5(base64_encode(md5(sha1("password")))) ;

คำถาม 
ต้องมีอยู่ในใจสำหรับใครบางคนว่า ? แล้วแบบนี้ Server จะไม่ทำงานหนักไปหรอ เพราะเข้ารหัสผ่านหลาย ๆ ครั้ง 
คำตอบ 
ก็คือ หนักกว่าปกติครับ แต่ในจำนวนสมาชิกที่น้อย จะไม่เห็นผลแตกต่างกันเลยครับ อีกอย่าง function ส่วนนี้ คิดว่าเอาไปใช้กับระบบ login เพราะฉะนั้ัน อาจจะช้าในตอน Login ในจำนวนสมาชิกเยอะ ๆ เท่านั้นครับ ( ปล.มากกว่า 50000 คนขึ้นไป )

ส่วนวิธีการนำเอาไปใช้งาน หรือวิธีการเชคก็ยังเหมือนเดิมครับ ผมยกตัวอย่างที่ 3 เวลาเชคก็จะเป็นแบบนี้ครับ

โค๊ด:
if ( md5(base64_encode(md5(sha1("password")))) == "password"){
 // ผ่าน
}else{
  // ไม่ผ่าน
}

จากข้างต้นเป็นแค่ตัวอย่าง สำหรับเช็ครหัสผ่านเข้าใช้งานระบบ หรือ login มาดูการเข้ารหัส PHP แบบง่ายๆที่ใช้สำหรับ
encode php ทั้งหน้า page หรือ แปลงเฉพาะส่วนที่ต้องการตามแต่ จะเอาไปใช้งานครับ

การใช้งานเบื้องต้นหลักๆแล้วมี 2 อย่างคือ :

โค๊ด:
($string,$key); ?>
หมายถึงการเข้ารหัสข้อมูล 

โค๊ด:
($string,$key); ?>
หมายถึงการถอดรหัสมาแสดงผลบนหน้าเว็บ 

ลองสร้าง code ดูกันเลยดังนี้  อันดับแรก !สร้างฟังก์ชั่นขึ้นมาก่อน 
ให้ชื่อไฟล์ว่า : encodeFunc.php

โค๊ด:
function encode($string,$key) {
    
$key sha1($key);
    
$strLen strlen($string);
    
$keyLen strlen($key);
    for (
$i 0$i $strLen$i++) {
        
$ordStr ord(substr($string,$i,1));
        if (
$j == $keyLen) { $j 0; }
        
$ordKey ord(substr($key,$j,1));
        
$j++;
        
$hash .= strrev(base_convert(dechex($ordStr $ordKey),16,36));
    }
    return 
$hash;
}

function 
decode($string,$key) {
    
$key sha1($key);
    
$strLen strlen($string);
    
$keyLen strlen($key);
    for (
$i 0$i $strLen$i+=2) {
        
$ordStr hexdec(base_convert(strrev(substr($string,$i,2)),36,16));
        if (
$j == $keyLen) { $j 0; }
        
$ordKey ord(substr($key,$j,1));
        
$j++;
        
$hash .= chr($ordStr $ordKey);
    }
    return 
$hash;
}
?>

เพียงแค่นี้ก็สามารถเรียกไปใช้งานได้แล้ว โดย include ไปใช้งานเอา

ยกตัวอย่างเช่น 
เข้ารหัส:
โค๊ด:
echo encode("Please Encode Me!","This is a key"); ?>

ผลที่ได้คือ:
โค๊ด:
p3e4e4241674d2r4m4i5o464a4f2p3k5c2

แปลงกลับมาใช้งาน:
โค๊ด:
echo decode("p3e4e4241674d2r4m4i5o464a4f2p3k5c2","This is a key"); ?>

จะได้ผลลับดังนี้:
โค๊ด:
Please Encode Me!

ขอบคุณ boonsit และ xvlnw สำหรับข้อมูลเบื้องต้น

1 comment: