ข้ามไปที่เนื้อหาหลัก

การเก็บข้อมูลรหัสผ่านสำหรับล็อกอินเราควรจะเข้ารหัส md5 ก่อน และใส่สีตีไข่ลงไปด้วย

การเข้ารหัสข้อมูลการล็อกอินก่อนเก็บลงฐานข้อมูลนั้น จะว่าสำคัญมั้ยก็ไม่เชิง เพราะมันเป็นเพียงการเพิ่มความเชื่อมันให้ผู้ใช้งานว่าจะไม่มีใครสามารถเห็นรหัสผ่านของเขาได้ เช่น ผู้ใช้งานอาจจะใช้รหัสผ่านเดียวกันนี้ในหลายๆเว็บไซต์ การที่มีใครคนใดคนหนึ่งรู้รหัสผ่าน ก็จะทำให้สามารถเข้าถึงข้อมูลในเว็บไซต์อื่นๆได้ และแน่นอนว่ารวมถึงเว็บไซต์ที่ปล่อยให้มีคนเห็นรหัสผ่านนี้ด้วย

สำหรับการเข้ารหัสด้วย md5() ก่อนบันทึกในฐานข้อมูลดังโค๊ดด่านล่างนี้

<?php

$pass = "Hello1234";
$my_md5 = md5($pass);

echo "<br/>ข้อความที่พิมพ์ : " , $pass;
echo "<br/>รหัสที่ได้คือ : <u>" , $my_md5, "</u>";

?>

ผลลัพธ์

ข้อความที่พิมพ์ : Hello1234
รหัสที่ได้คือ : cbd357125a99321c2a08e0206a97622f

ข้อมูลที่จะนำไปบันทึกคือ $my_md5 ที่เข้ารหัสแล้วนั่นเอง


กรณีที่มีแอดมินหรือผู้ใช้คนใดคนหนึ่งที่เข้าไปดูฐานข้อมูลได้ หรือเข้าไปยังหน้าข้อมูลผู้ใช้ได้และสามารถมองเห็นรหัสผ่านได้ก็จะเจอแต่ข้อความ cbd357125a99321c2a08e0206a97622f ก็จะเดาไม่ได้ว่ารหัสผ่านของผู้ใช้ก็ปลอดภัยในระดับหนึ่ง


อาจจะเกิดคำถามว่า "ถ้ามีคนเข้าถึงฐานข้อมูลขนาดนั้น ก็คงจะไม่มีอะไรปลอดภัยแล้วล่ะ"
ในฐานะโปรแกรมเมอร์ มุมมองผมคือทีมพัฒนา หรือผู้ใช้งานบางคนอาจจะได้รับสิทธิ์เข้าถึงข้อมูลบางอย่างในฐานข้อมูล แล้วทีนี้ถ้าเกิดว่าอาจจะเกิดการสื่อสารผิดพลาด ปล่อยให้แอดมินเลเวลที่ไม่ได้รับอนุญาตเข้าไปดูข้อมูลได้จะเกิดอะไรขึ้น

แน่นอนว่ากรณีนี้ไม่ควรเกิดขึ้น แต่เราก็ควรจะป้องกันไว้ดีกว่ามาไล่เบี้ยกันทีหลัง

แต่รู้หรือไม่ว่า cbd357125a99321c2a08e0206a97622f หรือการ md5() ก็ถูกแกะได้ง่ายๆนะ เพราะสมมติว่ามีการเข้ารหัสคำว่า "Hello" คำนี้เป็นคำที่รู้จักกันโดยทั่วไปถ้าเอามาใช้ ถึงแม้จะเข้ารหัส md5() ไปแล้ว ก็จะถูกถอดรหัสได้ง่ายๆด้วยเว็บไซต์ที่รวบรวมฐานข้อมูลข้อความที่ md5 ไว้นั่นเอง

ลองค้นหาในกูเกิ้ลด้วยคำว่า "md5 decrypt" จะพบว่ามีเว็บไซต์หลายเว็บที่ถอดรหัสได้ เพราะมีฐานข้อมูลการ md5 ข้อความทั่วไปเก็บไว้อยู่แล้ว

ทีนี้เราก็ต้องเพิ่มบางอย่างเข้าไป เพื่อให้ผลลัพธ์หลังเติมแต่งเปลี่ยนไปจากเดิม และเมื่อจะนำมาถอดรหัสเราก็ตัดส่วนที่เพิ่มเข้าไปทิ้งก่อน ก็จะได้ส่วนที่ต้องการถอดรหัสจริงมาใช้งาน ซึ่งเว็บไซต์ที่ยกตัวอย่างมาเบื้องต้น ก็ไม่สามารถที่จะถอดรหัสข้อมูล md5 ของเราได้


ลองค้นหาคำว่า "md5 salt" ในเว็บไซต์กูเกิ้ลดูครับ จะพบวิธีมากมายหลายหลาย

ยกตัวอย่างง่ายๆในการป้องกันการแกะรหัส md5 ของเราก็คือ การวนลูปเข้ารหัสสักสองสามรอบ หรือกี่รอบก็ได้ เวลาคนที่ได้รหัสไปก็จะต้องเดาก่อนว่า ทำไมถึงถอดรหัสไม่ได้ แล้ววนลูปกี่ครั้ง

แต่วิธีที่ได้ผลที่สุดคือการ สุ่มข้อความ แล้วนำมาแทรกรหัสตามตำแหน่งต่างๆ ที่คอนฟิกค่าตำแหน่งไว้ จากนั้นก็นำไปเข้ารหัส md5 อีกครั้ง แล้วอาจจะแต่งเติมอะไรบางอย่างอีกนิดหน่อย ทีนี้ก็ปลอดภัยแล้วครับ


สรุปคือ การเข้ารหัสผ่านของผู้ใช้งาน เป็นเรื่องที่ควรจะทำไว้ ไม่ได้เพื่อป้องกันผู้ใช้งานภายนอก แต่เป็นการป้องกันการเข้าถึงข้อมูลภายในของแอดมินด้วยกันเอง




PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม

สนใจสั่งซื้อเพียง 4,500 บาท
http://fastcoding.phpcodemania.com/

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

แจกฟรี!! ระบบต่างๆที่พัฒนาด้วย PHP สำหรับนำไปใช้ในงานต่างๆ

       สำหรับหลายท่านที่ขอโค้ดเข้ามาทาง Inbox ของเฟซบุ๊กแฟนเพจ หรือถามถึงระบบต่างๆหลังไมค์มานั้น ส่วนใหญ่ก็มีแจกอยู่แล้วในเว็บบอร์ด ThaiCreate.Com นะครับ และด้านล่างนี้ก็เป็นระบบต่างๆที่แจกให้นำไปลองใช้ลองศึกษากันครับ

สอนเขียน PHP แสดงการจองห้องประชุมแบบไฮไลท์ตามช่วงเวลา (แบบเชื่อมต่อฐานข้อมูล MySQL)

ตัวอย่าง ผลลัพธ์ที่ได้จากการจองในฐานข้อมูล ตาราง tb_room สร้างตารางรายชื่อห้องประชุม สำหรับ id นั้นเป็น Primarykey จะกำหนดให้สร้างอัตโนมัติ ทุกครั้งที่เราเพิ่มชื่อห้องประชุมใหม่ -- -- Database: `tobedev_example` -- -- -------------------------------------------------------- -- -- Table structure for table `tb_room` -- CREATE TABLE IF NOT EXISTS `tb_room` (   `id` int(11) NOT NULL,   `name` varchar(30) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- -- Dumping data for table `tb_room` -- INSERT INTO `tb_room` (`id`, `name`) VALUES (1, 'ห้องประชุม 1'), (2, 'ห้องประชุม 2'), (3, 'ห้องประชุม 3'), (4, 'ห้องประชุม 4'), (5, 'ห้องประชุม 5'); -- -- Indexes for dumped tables -- -- -- Indexes for table `tb_room` -- ALTER TABLE `tb_room`   ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `tb_room` -- ALTER TABLE `tb_room`   MODIFY `i...

การดึงข้อมูล MySQL มาแสดงในปฏิทิน Fullcalendar ด้วย PHP

หลักการทำงาน เรียกข้อมูลจากตาราง tb_event ด้วยฟังก์ชั่นของ MySQLi ข้อมูลจากฐานข้อมูลจะถูกวนลูปเก็บไว้ใน $data และจะถูกส่งไปที่ Fullcalendar ด้วยการแปลงข้อมูลจาก PHP ให้อยู่ในรูปแบบ JSON อาร์เรย์ด้วยฟังก์ชั่น json_encode() PHP Code <?php //Database $data = array(); $link = mysqli_connect("127.0.0.1", "tobedev", "1234", "tobedev_example"); mysqli_set_charset($link, 'utf8'); if (!$link) {     echo "Error: Unable to connect to MySQL." . PHP_EOL;     echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;     echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;     exit; } $query = "SELECT * FROM tb_event"; if ($result = $link->query($query)) {     /* fetch object array */     while ($obj = $result->fetch_object()) {        $data[] = array(                 ...