https://medium.com/of-all-things-tech-progress/starting-with-authentication-a-tutorial-with-node-js-and-mongodb-25d524ca0359
โดยยึดตาม link ข้างต้นโดยเปลี่ยนจาก MongoDB เป็น sqlite โดยใช้ sequelize ครับ
ความรู้เพิ่มเติม
Password Hash (and salt)
รหัสผ่านนั้นเป็นข้อมูลที่ต้องถูกปิดบังแม้แต่ผู้ดูแลระบบเองรวมถึงหลายครั้งข้อมูลถูกแบ็กอัพเก็บเอาไว้ ผู้ใช้อาจจะใช้รหัสผ่านเดียวกันในหลายบริการ (ซึ่งเป็นนิสัยที่อันตรายต่อความปลอดภัย แต่ผู้ใช้จำนวนมากก็ทำเช่นนี้) ในกรณีสุดวิสัย ฐานข้อมูลรหัสผ่านอาจจะรั่วไหลไปยังแฮกเกอร์ที่เราพบกันได้บ่อยครั้ง การแฮชรหัสผ่านก่อนที่จะเก็บจึงช่วยแก้ปัญหานี้ ข้อมูลที่เก็บอยู่บนเซิร์ฟเวอร์จะเป็นเพียงค่าแฮชที่ไม่ (ควร) มีใครรู้ว่าค่าตั้งต้นของมันเป็นอะไร เช่น บางครั้งแฮกเกอร์ก็เป็นผู้ดูแลระบบหรือผู้ดำเนินการแบ็กอัพเสียเอง หากคนเหล่านี้สามารถรู้ได้ว่ารหัสผ่านคืออะไร พวกเขาอาจจะออกไปล็อกอินบริการผ่านช่องทางปกติ แล้วใช้รหัสผ่านของลูกค้าเพื่อเข้าสู่ระบบได้โดยง่ายเว็บเฟรมเวิร์คสมัยใหม่จะเก็บรหัสผ่านผู้ใช้เป็นค่าที่แฮชแล้วทั้งหมด เป็นเหตุผลให้เมื่อผู้ใช้ลืมรหัสผ่าน เว็บจะไม่สามารถส่งรหัสผ่านเดิมกลับไปยังผู้ใช้ได้เลย (เพราะไม่มีใครรู้รหัสแล้ว) กระบวนการเดียวที่ทำได้คือการส่งลิงก์ที่เป็นลิงก์สร้างขึ้นเฉพาะ (มักต่อท้ายด้วยสตริงสุ่มยาวๆ ให้เดาไม่ได้) แล้วให้ผู้ใช้กดเข้ามาเปลี่ยนรหัสผ่านได้เท่านั้น
แม้ว่าฟังก์ชั่นแฮชจะทนทานต่อการย้อนกลับหาค่าตั้งต้น แต่พลังของคอมพิวเตอร์ทุกวันนี้กลับสูงมากจนกระทั่งเป็นไปได้ที่จะเก็บค่าความเป็นไปได้ทุกกรณีของแฮช เมื่อเราเห็นค่าแฮชสักค่าหนึ่ง เราอาจจะค้นหามันได้ทั่วไปว่าที่จริงแล้วมันเป็นค่าอะไร เช่น ค่า bf072e9119077b4e76437a93986787ef ยิ่งหากผู้ใช้ใช้รหัสผ่านที่ใช้กันบ่อย โอกาสที่จะพบค่าแฮชที่ตรงกันทำให้รู้รหัสผ่านเริ่มต้นก็มากขึ้น
กระบวนการหลีกเลี่ยงค่าแฮชของค่าที่พบบ่อย ทำให้มีข้อเสนอการเติมค่าเข้าไปอีกชุดหนึ่งก่อนแฮชเพื่อให้ค่าเปลี่ยนไป โดยค่านี้อาจจะเก็บเป็นความลับระหว่างผู้ที่เข้าถึงฐานข้อมูลของรหัสผ่าน โดยเติมค่าที่สุ่มมาอีกชุดหนึ่งต่อท้ายข้อมูลที่จะแฮช ทำให้ค่าแฮชที่ได้ไม่ตรงกับค่าแฮชทั่วไปที่ใช้งานกัน เช่น หากต้องการเก็บค่าแฮช SHA1 ของรหัสผ่าน "1234" แทนที่จะแฮชค่า "1234" โดยตรงซึ่งจะให้ค่าแฮช "1be168ff837f043bde17c0314341c84271047b31" ก็ให้สร้างอักษรสุ่ม เช่น "A1d944" เข้ามาต่อท้ายทำให้ค่าเปลี่ยนไปเป็น "14048a9ac614bd653defca9e63db28d1377c0df4" เมื่อต้องการเทียบค่าอีกครั้ง ไม่ว่าผู้ใช้จะใส่ค่าอะไรเป็นรหัสผ่านก็ให้นำสตริง "A1d944" เข้าไปต่อท้ายทุกครั้ง เรียกกระบวนการนี้ว่า Salt
นอกจากการปิดบังรหัสผ่านแล้ว ยังมีกรณีที่ต้องการปิดบัง เช่น มาตรฐานการเก็บหมายเลขบัตรเครดิตนั้น ไม่ควรเก็บหมายเลขบัตรเครดิตไว้โดยตรงในฐานข้อมูล แต่ให้เก็บค่าแฮช (ที่อาจจะไม่ต้อง Salt) เพื่อใช้ยืนยันว่าผู้ใส่หมายเลขบัตรเครดิตนั้นเป็นลูกค้าที่ใช้บริการร้านค้าอยู่หรือไม่ และใช้หมายเลขที่ลูกค้าเพิ่งใส่มาในการยืนยันไปยังธนาคารเพื่อตัดเงิน การทำเช่นนี้ในกรณีที่ร้านค้าถูกแฮกก็ยังไม่ทำให้หมายเลขบัตรเครดิตของลูกค้าถูกเปิดเผย
แต่ปัญหาของฟังก์ชั่นแฮชยังคงมีประเด็นใหม่ๆ ฮาร์ดแวร์ปัจจุบันได้รับการปรับปรุงอย่างรวดเร็ว ชิปจำนวนมากถูกเพิ่มชุดคำสั่งพิเศษเพื่อเร่งความเร็วในการคำนวณแฮช ทำให้การคำนวณค่าแฮชทำได้เร็วขึ้นเรื่อยๆ ปัญหาความปลอดภัยเกิดขึ้นเมื่อการคำนวณค่าแฮชทำได้อย่างรวดเร็ว ทุกวันนี้การตั้งรหัสผ่านของคนเรามักจำกัดอยู่ที่ไม่เกิน 8 ตัวอักษร ซึ่งหากใช้ตัวอักษรเล็กภาษาอังกฤษทั้งหมดก็จะมีความเป็นไปได้เพียงสองแสนล้านกรณีเท่านั้น ฮาร์ดแวร์ความเร็วสูงและการใช้บริการกลุ่มเมฆทำให้การคำนวณค่าแฮชใหม่ทั้งหมดสำหรับความเป็นไปได้เพียงเท่านี้สามารถทำได้ในเวลาอันสั้น หรือแม้แต่การจำคำสุ่มในภาษาอังกฤษสี่คำ ก็ยังมีความเป็นไปได้เพียง 4.5 ล้านล้านกรณี ในกรณี
เราไม่สามารถเพิ่มความยาวรหัสผ่านไปเรื่อยๆ เพื่อให้มีความเป็นไปได้สูงพอที่แฮกเกอร์จะไม่สามารถไล่คำนวณรหัสผ่านใหม่ทั้งหมดได้ กระบวนการที่พอช่วยได้คือการสร้างฟังก์ชั่นแฮชรูปแบบใหม่ที่ "ช้า" ฟังก์ชั่นทั่วไปอาจจะคำนวณสำเร็จภายในเวลาระดับไมโครวินาที แต่ฟังก์ชั่นแฮชสำหรับรหัสผ่านจะใช้เวลามากกว่านั้นนับพันหรือนับหมื่นเท่า หากใช้สำหรับคำนวณรหัสผ่านผู้ใช้ที่ป้อนรหัสก็มักไม่ส่งผลทำให้การให้บริการช้าลงนัก แต่หากแฮกเกอร์จะไล่รหัสผ่านที่เป็นไปได้ทุกกรณี การช้าลงนับพันเท่าจะทำให้แฮกเกอร์คำนวณทุกค่าที่เป็นไปได้ได้ยากขึ้นมาก (หากออกแบบแข็งแรงพอ น่าจะไม่สามารถทำได้ในช่วงชีวิต) ฟังก์ชั่นเหล่านี้ได้แก่ bcrypt ที่ช้าโดยกระบวนวิธีภายในเองแม้จะช้าแต่แฮกเกอร์ในยุคหลังก็สามารถสร้างฮาร์ดแวร์ผ่านชิป FPGA เพื่อเร่งความเร็วได้ดีขึ้นเรื่อยๆ,มาตรฐานการแฮชที่ช้าที่เป็นมาตรฐานคือ PBKDF2 (แบบเดียวกับที่ 1Password ใช้) โดยกระบวนการแล้วมันคือการคำนวณค่าแฮชด้วยฟังก์ชั่นที่ระบุ โดยสามารถระบุได้เป็นทั้ง SHA1 และ MD5 แล้วคำนวณซ้ำๆ ไปตามจำนวนรอบที่กำหนด โดยแนะนำไม่ต่ำกว่า 1000 รอบ ข้อเสนอใหม่เช่น scrypt สร้างฟังก์ชั่นที่ช้าและต้องการหน่วยความจำสูง ทำให้สร้างฮาร์ดแวร์มาเร่งความเร็วได้ลำบาก (เพราะหน่วยความจำในชิปจะกินพื้นที่สูงมาก)
ข้อมูลจาก : https://www.blognone.com/node/43630
ไม่มีความคิดเห็น:
แสดงความคิดเห็น