เข้ารหัสข้อมูลรหัสผ่านด้วย password_hash()
สำหรับการเข้ารหัสด้วย md5() เพียงอย่างเดียวสามารถถอดรหัสได้แล้วด้วยฐานข้อมูลที่มีข้อมูลรหัสจำนวนมหาศาลดังนั้น PHP จึงได้สร้างฟังก์ชั่นใหม่ขึ้นมารองรับการเข้ารหัสที่ดีกว่าเดิม แต่นั่นก็ไม่ใช่เหตุผลให้เราทิ้งฟังก์ชั่น md5() ไปเลยเสียทีเดียว เพราะยังมีประโยชน์ในการเข้ารหัสที่ได้รหัสเหมือนเดิมทุกครั้ง และใช้แค่ 32 หลักเท่านั้น
แต่เพื่อความปลอดภัยของรหัส เราก็จำเป็นจะต้องทำการผสมผสานข้อมูลใหม่ เพื่อให้เมื่อแกะออกมาแล้วไม่สามารถเข้าใจมันได้ด้วยนั่นเอง
โค้ดตัวอย่างการเข้ารหัส md5() ก่อนเรียกใช้ password_hash() อีกครั้ง
<?php
header('Content-Type: text/html; charset=utf-8');
function utf8_strrev($str)
{
preg_match_all('/./us', $str, $ar);
return join('', array_reverse($ar[0]));
}
function pass_encrypt($pass, $show = false)
{
//you secret word
$key1 = 'asdfasf';
$key2 = 'asdfasdf';
$loop = 1;
$reverse = utf8_strrev($pass);
if ($show == true) {
echo '<br> กลับตัวอักษร : ', $reverse;
}
for ($i = 0; $i < $loop; $i++) {
$md5 = md5($reverse);
if ($show == true) {
echo '<br> เข้ารหัสเป็น 32 หลัก : ', $md5;
}
$reverse_md5 = utf8_strrev($md5);
if ($show == true) {
echo '<br> กลับตัวอักษร : ', $reverse_md5;
}
$salt = substr($reverse_md5, -13) . md5($key1) . substr($reverse_md5, 0, 19) . md5($key2);
if ($show == true) {
echo '<br> สร้างข้อความใหม่ : ', $salt;
}
$new_md5 = md5($salt);
if ($show == true) {
echo '<br> เข้ารหัสเป็น 32 หลัก : ', $new_md5;
}
$reverse = utf8_strrev($new_md5);
if ($show == true) {
echo '<br> กลับตัวอักษรอีกครั้ง : ', $reverse;
}
}
return md5($reverse);
}
$pass = "สวัสดี+2561";
echo '<br> md5() ธรรมดา : ', md5($pass);
//เข้ารหัส md5 ก่อน
$encrypt = pass_encrypt($pass, true);
// และเข้ารหัส hash เพื่อนำไปบันทึกลงฐานข้อมูล
$hash = password_hash($encrypt, PASSWORD_DEFAULT);
echo '<hr/>รหัสผ่าน : ' . $pass;
echo '<br/> ผลลัพธ์ : <b>' . $hash . '</b>';
echo '<br/>ความยาวของตัวอักษร : <b>', strlen($hash), '</b>';
//ข้อมูลทดสอบ
$pass_in_db = '$2y$10$xvm4oq.N96bUQTQIw9u/fuUHAPEg80OZBWztKx8pxry96tJwWdu0.';// is $hash
$post_data = "สวัสดี+2561";
echo '<hr/><br/>from <b>POST</b> = ' . $post_data;
echo '<br/>data in <b>DB</b> = ' . $pass_in_db;
echo '<br/><b>Md5</b> = ', md5($post_data);
if (password_verify(pass_encrypt($post_data), $pass_in_db)) {
echo '<br/><br/><span style="color:green">Password is valid!</span>';
} else {
echo '<br/><br/><span style="color:red">Invalid password.</span>';
}
?>
<br/><br/>
<h3>Function Reference</h3>
<pre>
http://php.net/manual/en/function.strrev.php
http://php.net/manual/en/function.md5.php
http://php.net/manual/en/function.password-hash.php
http://php.net/manual/en/function.password-verify.php
</pre>
ทดสอบโค้ดได้ที่ https://phpfiddle.org/
อ้างอิง
http://php.net/manual/en/function.strrev.phphttp://php.net/manual/en/function.md5.php
http://php.net/manual/en/function.password-hash.php
http://php.net/manual/en/function.password-verify.php
ความคิดเห็น
แสดงความคิดเห็น