คลังเก็บบล็อก

login แบบปลอดภัย


การเก็บรหัสผ่านในระบบ ไม่ควรเก็บรหัสผ่านไว้ตรงๆ ถ้า user ใช้รหัสผ่าน 1234 ก็ไม่ควรบันทึกข้อมูล 1234 ลงไป มี 2 เหตุผลคือ

  1. ถ้าโดนขโมยข้อมูลในฐานข้อมูลไป hacker cracker จะรู้ทั้งหมดว่าใครใช้รหัสผ่านอะไร แต่เราอาจจะไม่รู้ว่าโดนเล่นไปแล้ว จนมีความเสียหายออกมา (sony, apple, microsoft, กระทรวงกลาโหมสหรัฐโดนมาหมดแล้ว ถึงจะเป็นเว็บเล็กๆ ก็ไม่มีเหตุผลอะไรที่จะคิดว่า ถ้า hacker จะทำจริงๆ แล้วเว็บเราจะปลอดภัย)
  2. ถ้ามีการทำงานอะไรผิดพลาดขึ้นมาก็จะไม่มีใครพูดว่า ฉันไม่ได้ทำ ฝ่าย it นั่นละทำรึเปล่า ก็รู้รหัสผ่านของทุกคนไม่ใช่เหรอ (เคยเจอปัดความรับผิดชอบง่ายๆ แบบนี้จริงๆ ตอนนั้นโชคดีที่มี ip log ช่วยไว้)

ใน PHP จะนิยมใช้ md5 เข้ารหัสแปลง password เป็นตัวอักษร 32 ตัวอักษรที่อ่านยังไงก็ดูไม่ออกว่าต้นฉบับคืออะไร แต่เพราะว่ามันเป็นวิธีที่ถ้าป้อนรหัสผ่านเดียวกันลงไป ก็จะได้คำตอบเหมือนเดิมทุกครั้ง ไม่ว่าจะทำในเครื่องไหน ทำให้เวลามีคนขโมยข้อมูลในตารางสมาชิกออกไปได้ จะสามารถหารหัสผ่านจริงๆ ได้ถ้าเอาไปเที่ยบกับตาราง rainbow table (ตารางที่เกิดจากการเปลี่ยนตัวอักษรไปเรื่อยๆ จากนั้นแล้วเข้ารหัสแล้วเก็บเอาไว้เปรียบเทียบหารหัสผ่านต้นฉบับ) หรือจะใช้บริการเว็บอย่าง md5decrypter, md5this ทำให้ยังไม่ปลอดภัยเท่าที่ควร

วิธีแก้คือใช้ salting ? ตอนเจอวีธีนี้ครั้งแรก งงว่ามันเกี่ยวอะไรกับเกลือ, การใส่เกลือ salting คือการเพิ่มชุดของสตริงเข้าไปในรหัสผ่านก่อนเข้ารหัส ตามตัวอย่าง

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>md5 salting</title>
</head>
<body>
<?php
$password = '1234';
echo '<br>password = "',$password,'"<br>MD5 ได้ <b>',md5($password),'</b><br>';
$salt = '2MnLPPdUZDHBQMYz5rB3GhMJYQRV9MyaYA3QHXEz';
echo '<br>password = "',$password,'" salt="',$salt,'"<br>MD5 ได้ <b>',md5($password.$salt),'</b><br>';
$salt = 'JnwMeUTJgMfjjM5E28jyHqQZ2JLRUnZk3FnM9zUK';
echo '<br>password = "',$password,'" salt="',$salt,'"<br>MD5 ได้ <b>',md5($password.$salt),'</b><br>',
'<br>ทดลอง decode <a href="http://www.md5decrypter.co.uk" target="_blank">md5decrypter</a>';
?>
</body>
</html>

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

ตัวอย่างระบบที่ใช้วิธีนี้คือ prestashop สมุติว่าลืมรหัสผ่านผู้ดูแลระบบเรานอกจากขอรับรหัสผ่านใหม่แล้ว สามารทำ manual reset password ได้โดย

  1. เปิดไฟล์ config/settings.inc.php หาค่าในตัวแปร _COOKIE_KEY_ อันนี้คือตัวแปรที่ prestashop ใช้เป็น salt ครับ
  2. ไปที่ phpMyAdmin เปิดตาราง xxx_employee หาชื่อ user ที่ต้องการ ที่ field password ให้ copy ค่าในตัวแปร _COOKIE_KEY_ ไปวางตามด้วยรหัสผ่านใหม่ที่ต้องการเปลี่ยน จากนั้นในช่อง function เลือก md5 บันทึก รหัสของผู้ใช้ก็จะเปลี่ยนไปตามรหัสที่เราใส่ไปหลังค่าใน _COOKIE_KEY_
Advertisements

เปลี่ยน password หลัง Jailbroken


สิ่งหนึ่งต้องทำหลัง jailbreak คือเปลี่ยนรหัสผ่าน root ของ iPhone / ipad เพราะว่าทุกเครื่องจะมีค่าที่ตั้งค่าจากโรงงานเหมือนกันคือ
Username: root
Password: alpine
แล้วถ้าไปลงบาง apps อย่าง openssh (จุดประสงค์หลักของหลายๆคน) แปลว่าคนอื่นก็สามารถใช้รหัสผ่านนี้ควบคุมเครื่องของคุณได้

เราจึงต้องเปลี่ยนรหัสผ่านใหม่ แบบที่มีเราคนเดียวที่ทราบ โดย

  1. ลง MobileTerminal จาก cydia ก่อน
  2. เปิด MobileTerminal หลายๆคนเจอปัญหา app crash หรือแอปปิดตัวเอง (ถ้่าไม่มีปัญหา ข้ามไปข้อต่อไปเลยครับ) ให้ไปเพิ่ม source ใน cydia ก่อน โดยไปที่ Manage> source > edit > add > ใส่ http://www.ijailbreak.com/repository/ กด > add source > done
    กด changes อัพเดต เปิด MobileTerminal อีกครั้ง
  3. พิมย์ command: su root กด return
  4. พิมย์ passwd กด return
  5. จะเห็น Old password: ใส่ alpine กด return
  6. จะเห็น Newpassword: ใส่ password ของคุณลงไป กด return
  7. จะเห็น Retype new password: ใส่ password ของคุณลงไป กด return อีกครั้ง

การเปลี่ยน password ของ root เรียบร้อยแล้ว ต่อไปจะเป็นการเปลี่ยน password ของ user mobile

  1. พิมย์ exit กด return
  2. พิมย์ passwd กด return
  3. จะเห็น Old password: ใส่ alpine กด return
  4. จะเห็น Newpassword: ใส่ password ของคุณลงไป กด return
  5. จะเห็น Retype new password: ใส่ password ของคุณลงไป กด return อีกครั้ง

เสร็จแล้ว เป็นไงครับ ได้อารมณ์ใช้ unix/linux ขึ้นมายัง

เสร็จแล้วครับ

%d bloggers like this: