การเข้ารหัสผ่านปัจจุบัน ในภาษา 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{
// ไม่ผ่าน
}
// ผ่าน
}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;
}
?>
$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 สำหรับข้อมูลเบื้องต้น
ขอบคุณมากครับ
ReplyDelete