การเข้ารหัสข้อมูลการล็อกอินก่อนเก็บลงฐานข้อมูลนั้น จะว่าสำคัญมั้ยก็ไม่เชิง เพราะมันเป็นเพียงการเพิ่มความเชื่อมันให้ผู้ใช้งานว่าจะไม่มีใครสามารถเห็นรหัสผ่านของเขาได้ เช่น ผู้ใช้งานอาจจะใช้รหัสผ่านเดียวกันนี้ในหลายๆเว็บไซต์ การที่มีใครคนใดคนหนึ่งรู้รหัสผ่าน ก็จะทำให้สามารถเข้าถึงข้อมูลในเว็บไซต์อื่นๆได้ และแน่นอนว่ารวมถึงเว็บไซต์ที่ปล่อยให้มีคนเห็นรหัสผ่านนี้ด้วย
สำหรับการเข้ารหัสด้วย md5() ก่อนบันทึกในฐานข้อมูลดังโค๊ดด่านล่างนี้
<?php
$pass = "Hello1234";
$my_md5 = md5($pass);
echo "<br/>ข้อความที่พิมพ์ : " , $pass;
echo "<br/>รหัสที่ได้คือ : <u>" , $my_md5, "</u>";
?>
ผลลัพธ์
ข้อมูลที่จะนำไปบันทึกคือ $my_md5 ที่เข้ารหัสแล้วนั่นเอง
กรณีที่มีแอดมินหรือผู้ใช้คนใดคนหนึ่งที่เข้าไปดูฐานข้อมูลได้ หรือเข้าไปยังหน้าข้อมูลผู้ใช้ได้และสามารถมองเห็นรหัสผ่านได้ก็จะเจอแต่ข้อความ cbd357125a99321c2a08e0206a97622f ก็จะเดาไม่ได้ว่ารหัสผ่านของผู้ใช้ก็ปลอดภัยในระดับหนึ่ง
อาจจะเกิดคำถามว่า "ถ้ามีคนเข้าถึงฐานข้อมูลขนาดนั้น ก็คงจะไม่มีอะไรปลอดภัยแล้วล่ะ"
ในฐานะโปรแกรมเมอร์ มุมมองผมคือทีมพัฒนา หรือผู้ใช้งานบางคนอาจจะได้รับสิทธิ์เข้าถึงข้อมูลบางอย่างในฐานข้อมูล แล้วทีนี้ถ้าเกิดว่าอาจจะเกิดการสื่อสารผิดพลาด ปล่อยให้แอดมินเลเวลที่ไม่ได้รับอนุญาตเข้าไปดูข้อมูลได้จะเกิดอะไรขึ้น
แน่นอนว่ากรณีนี้ไม่ควรเกิดขึ้น แต่เราก็ควรจะป้องกันไว้ดีกว่ามาไล่เบี้ยกันทีหลัง
แต่รู้หรือไม่ว่า cbd357125a99321c2a08e0206a97622f หรือการ md5() ก็ถูกแกะได้ง่ายๆนะ เพราะสมมติว่ามีการเข้ารหัสคำว่า "Hello" คำนี้เป็นคำที่รู้จักกันโดยทั่วไปถ้าเอามาใช้ ถึงแม้จะเข้ารหัส md5() ไปแล้ว ก็จะถูกถอดรหัสได้ง่ายๆด้วยเว็บไซต์ที่รวบรวมฐานข้อมูลข้อความที่ md5 ไว้นั่นเอง
ลองค้นหาในกูเกิ้ลด้วยคำว่า "md5 decrypt" จะพบว่ามีเว็บไซต์หลายเว็บที่ถอดรหัสได้ เพราะมีฐานข้อมูลการ md5 ข้อความทั่วไปเก็บไว้อยู่แล้ว
ทีนี้เราก็ต้องเพิ่มบางอย่างเข้าไป เพื่อให้ผลลัพธ์หลังเติมแต่งเปลี่ยนไปจากเดิม และเมื่อจะนำมาถอดรหัสเราก็ตัดส่วนที่เพิ่มเข้าไปทิ้งก่อน ก็จะได้ส่วนที่ต้องการถอดรหัสจริงมาใช้งาน ซึ่งเว็บไซต์ที่ยกตัวอย่างมาเบื้องต้น ก็ไม่สามารถที่จะถอดรหัสข้อมูล md5 ของเราได้
ลองค้นหาคำว่า "md5 salt" ในเว็บไซต์กูเกิ้ลดูครับ จะพบวิธีมากมายหลายหลาย
ยกตัวอย่างง่ายๆในการป้องกันการแกะรหัส md5 ของเราก็คือ การวนลูปเข้ารหัสสักสองสามรอบ หรือกี่รอบก็ได้ เวลาคนที่ได้รหัสไปก็จะต้องเดาก่อนว่า ทำไมถึงถอดรหัสไม่ได้ แล้ววนลูปกี่ครั้ง
แต่วิธีที่ได้ผลที่สุดคือการ สุ่มข้อความ แล้วนำมาแทรกรหัสตามตำแหน่งต่างๆ ที่คอนฟิกค่าตำแหน่งไว้ จากนั้นก็นำไปเข้ารหัส md5 อีกครั้ง แล้วอาจจะแต่งเติมอะไรบางอย่างอีกนิดหน่อย ทีนี้ก็ปลอดภัยแล้วครับ
สรุปคือ การเข้ารหัสผ่านของผู้ใช้งาน เป็นเรื่องที่ควรจะทำไว้ ไม่ได้เพื่อป้องกันผู้ใช้งานภายนอก แต่เป็นการป้องกันการเข้าถึงข้อมูลภายในของแอดมินด้วยกันเอง
PHP CI MANIA - PHP Code Generator
สำหรับการเข้ารหัสด้วย 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 อีกครั้ง แล้วอาจจะแต่งเติมอะไรบางอย่างอีกนิดหน่อย ทีนี้ก็ปลอดภัยแล้วครับ
สรุปคือ การเข้ารหัสผ่านของผู้ใช้งาน เป็นเรื่องที่ควรจะทำไว้ ไม่ได้เพื่อป้องกันผู้ใช้งานภายนอก แต่เป็นการป้องกันการเข้าถึงข้อมูลภายในของแอดมินด้วยกันเอง
ความคิดเห็น
แสดงความคิดเห็น