จะป้องกันการขโมยรหัสผ่านอย่างไร

สวัสดีครับช่วงนี้ข่าวสารเกี่ยวกับความคิดแบบแฮ็กเกอร์ ปลอดภัยมาแรงเหลือเกิน เมื่อไม่นานมานี้ก็มีข่าวว่าเว็บ drupal.org ถูกแฮ็กเกอร์เจาะเข้าไปอ่านฐานข้อมูลของผู้ใช้ หรือแม้แต่ Facebook และ Instagram เองก็มีข่าวพบช่องโหว่ออกมาเนืองๆ ทำให้ผู้ใช้งานเสี่ยงต่อการถูกขโมยข้อมูลและรหัสผ่านกันถ้วนหน้า

คำแนะนำที่หาได้ทั่วไปมักจะเป็นให้ผู้ใช้ระมัดระวังตัวเอง ฝึกตัวเองให้รอบคอบ ไม่เข้าเว็บสุ่มเสี่ยงต่อการติดมัลแวร์ ติดตั้งไฟล์วอลล์ ติดตั้ง antivirus หมั่นสแกนเครื่องคอมพิวเตอร์อยู่เสมอ อัพเดตระบบปฏิบัติการ ตั้งรหัสผ่านที่คาดเดาได้ยาก เปลี่ยนรหัสผ่านเป็นประจำ ติดตามข่าวสารที่แค่อ่านก็เหนื่อยแล้ว แถมไม่ใช่ว่าปฏิบัติตามแล้วจะปลอดภัย 100% อย่างเมื่อเดือนที่ผ่านมา เว็บไซด์หนังสือพิมพ์ และเว็บไซด์ธนาคารหลายแห่งในประเทศไทย ถูกเจาะเพื่อวางโทรจันสำหรับขโมยข้อมูลของผู้ใช้งาน ผู้ใช้งานที่ไม่รู้อิโหน่อิเหน่เมื่อเข้าไปทำธุรกรรมทางการเงินก็อาจโดนขโมย ข้อมูลได้

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



ข้อแนะนำสำหรับการเก็บรหัสผ่าน

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

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

วิธีนี้ดีขึ้นกว่าการเก็บรหัสผ่านในแบบ plaintext ขึ้นมาเล็กน้อย ขั้นตอนคือนำรหัสผ่านของผู้ใช้ไปเข้ารหัสด้วยอัลกอริทึมเข้ารหัส เช่น AES หรือ Triple-DES เป็นต้น จากนั้นจึงเก็บผลลัพธ์ที่ได้จากการเข้ารหัสแทนการเก็บรหัสผ่านแบบตรงๆ เมื่อต้องการตรวจสอบสิทธิ์ของผู้ใช้สามารถทำได้ 2 วิธี คือ

- นำรหัสผ่านที่เก็บอยู่ในฐานข้อมูลออกมาทำการถอดรหัส และเปรียบเทียบกับรหัสผ่านที่ผู้ใช้ส่งมา
- นำรหัสผ่านที่ผู้ใช้ส่งมาเข้ารหัส แล้วนำไปเปรียบเทียบกับรหัสผ่านที่เก็บในฐานข้อมูล

ข้อดี
เมื่อผู้ใช้ลืมรหัสผ่าน ผู้ดูแลระบบสามารถกู้รหัสผ่านอย่างง่ายดาย

ข้อเสีย
1. เนื่องจากอัลกอริทึมเข้ารหัสต้องอาศัยกุญแจในการเข้า/ถอดรหัส ซึ่งกุญแจนี้จะถูกต้องเก้บเป็นความลับ แฮ็กเกอร์ก็จะเปลี่ยนเป้าหมายจากการหารหัสผ่าน เป็นการหากุญแจสำหรับอัลกอริทึมเข้า/ถอดรหัสแทนถ้าแฮ็กเกอร์ได้กุญแจไป รหัสผ่านที่เก็บไว้จะถูกอ่านได้ทันที ดังนั้นปัญหาที่ว่าเก็บรหัสผ่านอย่างไร จะกลายเป็นปัญหาว่าจะเก็บกุญแจสำหรับเข้ารหัสอย่างไรแทน ซึ่งกุยแจสำคัญอัลกอริทึมเข้า/ถอดรหัสดังกล่าวไม่สามารถเขียนฝังไว้ในโปรแกรมได้โดยตรงๆ เพราะแฮ็กเกอร์ สามารถหาข้อมูลจาก PE file ได้เสมอ (แต่ถ้ามองในแง่ดีการเก็บกุญแจ 10 ดอกให้ปลอดภัยยังง่ายกว่าการเก็บรหัสผ่านของผู้ใช้ 100 คนให้ปลอดภัยนะ)

2. หากใช้อัลกอริทึมเข้ารหัสแบบบล็อก (Block Cipher) จะต้องมีการเก็บความยาวของรหัสผ่านเอาไว้ด้วย เพราะอัลกอริทึมเข้ารหัสแบบบล็อกจะเข้ารหัสข้อมูลที่มีความยาวตามที่กำหนดไว้ ดังนั้นจึงต้องทำการ padding ข้อมูลเพื่อให้ได้ความยาวตามที่ต้องการก่อนเข้ารหัส และเมื่อถอดรหัสแล้วจะต้องอาศัยความยาวของรหัสผ่านเป็นตัวบอกว่ารหัสผ่านดั้งเดิมมีความยาวเท่าใดและถอดตัว padding ทิ้ง โปรดจำเอาไว้ว่าความยาวของรหัสผ่านเป็นข้อมูลที่สำคัญมาก หากแฮ็กเกอร์ทราบความยาวของรหัสผ่านจะช่วยให้การเดารหัสผ่านทำได้ง่ายขึ้นมาก

3. การตรวจสอบสิทธิ์ผ่านระบบเครือข่ายจำเป็นต้องส่งรหัสผ่านในรูป plaintext ไปยังเครื่องแม่ข่ายหรือส่งกุญแจไปยังเครื่องผู้ใช้ เพื่อให้เข้ารหัสก่อนส่งมายังเครื่องแม่ข่าย ดังนั้นรหัสผ่านหรือกุญแจอาจรั่วไหลได้

4. ถ้ามีผู้ใช้ที่ใช้รหัสผ่านเดียวกัน จะทำให้ผลลัพธ์ที่ได้จากการเข้าถึงรหัสมีค่าเดียวกันสามารถแก้ได้โดยใช้ SALT(ดูข้อแนะนำที่ 4 )
จะใช้วิธีนี้เมื่อใด

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

เก็บค่าแฮชของรหัสผ่าน

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

สำหรับขั้นตอนในการเก็บรหัสผ่านโดยใช้ฟังก์ชันแฮชนั้น ทำโดยนำรหัสผ่านไปคำนวณด้วยฟังก์ชันแฮชและเก็บค่าที่ได้หลังจากผ่านฟังก์ชันแฮช (ค่าแฮช) แทนการเก็บรหัสผ่านตรงๆ ในการตรวจสอบสิทธิ์ของผู้ใช้ ให้นำรหัสผ่านที่ระบบได้รับมาผ่านฟังก์ชันแฮช และนำค่าที่ได้ไปเปรียบเทียบกับค่าแฮชที่เก็บไว้ ถ้าค่าแฮชของรหัสผ่านที่ส่งมาตรงกับค่าแฮชที่เก็บไว้แสดงว่ารหัสผ่านของผู้ใช้ถูกต้อง

ข้อดี
1. ฟังก์ชันแฮชที่ใช้สามารถประกาศให้ทุกคนรู้ได้
2. การหาค่าย้อนคืนของรหัสผ่านจากค่าแฮชทำได้ยากมาก ส่งผลให้รหัสผ่านจริงรั่วไหลได้ยากกว่าเดิม
3. ไม่มีการเก็บรหัสผ่านจริงเอาไว้ ดังนั้น ถึงแม้ฐานข้อมูลที่เก็บค่าแฮชไว้จะถูกขโมยไปแต่สิ่งที่ได้ไปเป็นค่าแฮชเท่านั้น
4. ไม่จำเป็นต้องเก็บความยาวของรหัสผ่านทำให้การเดารหัสผ่านทำได้ยากกว่าเดิม
5. ไม่ต้องกังวลเรื่องการเก็บกุญแจสำหรับเข้า/ถอดรหัสเหมือนวิธีแรก เพราะการใช้ฟังก์ชันแฮชไม่จำเป็นต้องใช้กุญแจ
6. การตรวจสอบสิทธิ์ผ่านระบบเครือข่ายสามารถทำได้โดยไม่จำเป็นต้องส่งรหัสผ่านในรูป plaintext เพียงแค่ให้ผู้ใช้นำรหัสผ่านของตนผ่านฟังก์ชันแฮชที่ประกาศไว้แล้วส่งค่าแฮชมายังเครื่องแม่ข่าย ดังนั้น สิ่งที่แฮ็กเกอร์สามารถดักจับได้จะมีเพียงค่าแฮชเท่านั้น

ข้อเสีย
1. เมื่อผู้ใช้ทำรหัสผ่านหายจะไม่สามารถกู้คืนได้
2. ถ้าผู้ใช้ที่ใช้รหัสผ่านเดียวกัน จะทำให้ค่าแฮชที่ได้มีค่าเหมือนกัน สามารถแก้ได้โดยใช้ SALT
จะใช้วิธีนี้เมื่อใด

วิธีนี้มีความปลอดภัยสูง แต่ต้องระวังในการเลือกใช้ฟังก์ชันแฮช ควรเลือกใช้ฟังก์ชันแฮชที่มีความปลอดภัยสูง เช่น SHA- 2 (ไม่แนะนำให้ใช้ SHA-1 และ MD5) และควรใช้งานควบคู่กับการใช้ SALT

ข้อแนะนำในการเก็บความยาวของรหัสผ่าน
วิธีการเข้ารหัสก่อนเก็บลงฐานข้อมูลจำเป็นจะต้องเก็บความยาวเอาไว้เมื่อใช้อัลกอริทึมเข้ารหัสแบบบล็อก แต่ความยาวของรหัสผ่านเป็นข้อมูลที่มีความสำคัญมาก เพราะถ้าหากรู้ข้อมูลนี้ถูกล่วงรู้โดยแฮ็กเกอร์ จะช่วยให้แฮ็กเกอร์ตัดรหัสผ่านที่ไปไม่ได้ออกเป็นจำนวนมาก ตัวอย่างเช่น หากแฮ็กเกอร์รู้ว่ารหัสผ่านนี้ยาว 5 จะทำให้เหลือรหัสผ่านที่ต้องค้นหาเป็นจำนวน 945= 7,339,040,224 รหัส (พิจารณาจากจำนวนตัวอักษรทั้งหมดบนคีย์บอร์ดแบบ QWERTY)

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

ข้อแนะนำในการใช้ SALT
ทั้งวิธีการเข้ารหัส และการใช้ฟังก์ชันแฮชมีปัญหาอย่างเดียวกันคือ เมื่อผู้ใช้สองคนใช้รหัสผ่านเดียวกัน ค่าที่ได้จากการเข้ารหัสและค่าแฮชจะเป็นค่าเดียวกัน ซึงปัญหานี้สามารถแก้ได้โดย SALT

SALT คือข้อมูลชุดชุดหนึ่งที่สุ่มเพิ่มขึ้นมาเพื่อนำมาต่อกับข้อมูลที่จะนำไปผ่านฟังก์ชันแฮช(หรืออัลกอริทึมเข้ารหัส) ดังนั้นถึงแม้จะมีรหัสผ่านเดียวกันแต่มี SALT ต่างกันจะได้ค่าแฮชที่ต่างกัน

นอกจากนี้การใช้ SALT ยังเพิ่มความปลอดภัยอย่างมากเมื่อเผชิญกับการโจมตีด้วย Rainbow Table หรือการโจมตีประเภท Time-Memory Trade-off (TMTO)

การใช้ SALT ควบคู่กับฟังก์ชันแฮชมีขั้นตอนการทำงานดังนี้
1. สร้างเลขสุ่มขึ้นมาโดย Cryptographically Secure Pseudorandom Generator
2. นำเลขสุ่มที่สร้างขึ้นไปต่อกับรหัสผ่าน
3. คำนวณค่าแฮชของค่าที่ได้จากข้อสอง
4. เก็บค่าแฮชพร้อมทั้ง SALT ลงฐานข้อมูล

ในขั้นตอนการตรวจสอบสิทธิ์สามารถทำได้ดังนี้

1. นำ SALT ของผู้ใช้ที่เก็บไว้มาต่อกับรหัสผ่านที่ผู้ใช้ส่งมา
2. คำนวณค่าแฮชทีได้จากข้อ 1
3. เทียบค่าแฮชที่ได้กับค่าแฮชที่อยู่ในฐานข้อมูล ถ้าตรงกันแสดงว่ารหัสผ่านถูกต้อง ถ้าไม่ตรงกันแสดงว่ารหัสผ่านไม่ถูกต้อง

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

ตัวอย่างการโจมตี
จากนี้ไปจะแสดงให้ดูว่าแฮ็กเกอร์สามารถหารหัสผ่านจากระบบที่เก็บรหัสผ่านในแบบ plaintext ได้ง่ายขนาดไหน อย่างที่บอกไว้ตั้งแต่แรกว่าการเก็บรหัสผ่านในแบบ plaintext ไม่ว่าจะเก็บไว้ที่ไหนก็ไม่ปลอดภัยทั้งนั้น แม้รหัสผ่านจะถูกเขียนฝังไว้ในตัวโปรแกรมก็ตาม แฮ็กเกอร์ก็สามารถหาวิธีเข้าไปดูได้อยู่ดี จากนี้ไปจะแสดงวิธีการงัดแงะข้อมูลในรูป plaintext ที่ฝังอยู่ในโปรแกรมที่เขียนด้วยเทคโนโลยี . NET ออกมาแต่ก่อนจะไปดูวิธีการการโจมตี ขอให้ท่านผู้อ่านทำความเข้าใจเกี่ยวกับ CLR’s Execution Model ก่อน

โปรแกรมที่เขียนด้วยเทคโนโลยี. NET ไม่ว่าจะใช้ภาษา C++, C# หรือ VB.NET สิ่งทีได้หลังจากการคอมไพล์เบื้องต้นจะอยู่ในรูปของ Microsoft Intermediate Language ( MSIL) ซึ่ง MSIL นี้ยังไม่สามารถทำงานได้ แต่เมื่อเรียกโปรแกรมเหล่านี้ขึ้นมาทำงาน MSIL จะถูกคอมไพล์อีกครั้งขณะทำงาน (หรือที่เรียกว่า Just- in-time Compilation) ให้กลายเป็นภาษาเครื่องที่สามารถทำงานได้จริงๆ โดยสิ่งที่ทำหน้าที่ในการแปล MSIL ให้เป็นภาษาเครื่อง คือ Common Language Runtime (CLR) ซึ่งเป็นส่วนประกอบหนึ่งใน Microsoft’s NET framework

ในขั้นตอนการคอมไพล์ภาษาระดับสูงคอมไพเลอร์จะรวมมี Metadata เข้ากับ MSIL ให้กลายเป็น Portable Executable file (PE file) ซึ่ง metadata นี้จะรวบรวมข้อมูลต่างๆ เช่น โครงสร้างข้อมูล คลาส ฟิลด์ เป็นต้น และ MSIL ยังมีรายละเอียดเกี่ยวกับขั้นตอนการทำงานของโปรแกรม ดั้งนั้นแฮ็กเกอร์จึงมักใช้ PE file เป็นแหล่งสำหรับหาข้อมูลเบื้องต้นของเป้าหมายเสมอ
เพื่อแสดงให้ดูว่าการเก็บรหัสผ่านในรูปของ plaintext เสี่ยงต่อการถูกขโมยข้อมูลอย่างไร ขอให้ลองพิจารณาจากตัวอย่างต่อไปนี้ สมมติว่าเราเขียนโปรแกรมสำหรับตรวจสอบการเข้าสู่ระบบด้วยภาษา C# โดยใช้ Windows Form ลักษณะ
ดังนี้

Username และ Password ที่ถูกกรองจากหน้าจอเข้าสู่ระบบจะถูกตรวจสอบเมื่อกดปุ่ม Submit ถ้าข้อมูลที่กรองเข้ามาตรงกับที่ประกาศไว้ในคลาส ConstantSting จะแสดงข้อความว่า Login Successful แต่ถ้ากรอกข้อมูลผิดจะขึ้นข้อความว่า Login Fail โค้ดสำหรับตรวจสอบ Username หรือ Password มีดังต่อไปนี้

หลังจากเราคอมไพล์โปรแกรมแล้วจะได้เป็นไฟล์ .exe เพื่อเอาไปทำงานจากนี้เราจะงัดแงะเอา Username และ Password ที่อยู่ในไฟล์. Exe ออกมา เครื่องมือที่ใช้เพื่อการนี้คือ Intermediate Language Disassembler (ILDASM)

ILDASM จะถูกติดตั้งพร้อมกับ Visual Studio สามารถทำงานผ่านหน้าจอ GUI หรือทำงานผ่านหน้าจอคอนโซลก็ได้ ในกรณีนี้เราจะทำงานโดยผ่านหน้าจอคอนโซล วิธีเรียก ILDASM ขึ้นมาทำงานมีขั้นตอนคือ คลิกปุ่ม Start-> All Programs-> Visual Studio-> Visual Studio Tools-> Visual Studio Command Prompt

คำสั่งคำสั่งสำหรับการใช้งาน ILDASM จะมีลักษณะดังนี้
ildasm [ options] [PE filename] [options]
รายละเอียดของคำสั่งสำหรับการใช้งาน โปรแกรม ILDASM สามารถหาอ่านได้จากเว็บ http://msdn.microsoft.com/en-us/library/f7dy01k1.aspx ในการโจมตีโปรแกรมเป้าหมายของเรา จะใช้คำสั่งดังต่อไปนี้ ildasm/text LoginForm.exe | findstr ldstr

ตัวเลือก/text คือการสั่งให้แสดงผลการทำงานในหน้าจอคอนโซล และจากนั้นให้ส่งผลลัพธ์ไปยังคำสั่ง findstr เพื่อให้หาสายอักขระ ldstr โดย ldstr คือคำสั่งใน MSIL ใช้ในการโหลดอักขระเข้าสู่หน่วยความจำสแต็กหลังจาก ildasm ทำงานจะได้ผลลัพธ์ดังรูป ต่อไปนี้

รูปตาราง
จะออกคำสั่ง ldstr ทั้งหมดจะถูกแสดงออกมา รวมทั้ง Username และ Password (ในบรรทัด IL_0000 และ IL_000a) ที่เก็บไว้ในคลาส ConstantString ด้วย
ผู้พัฒนาโปรแกรมอาจป้องกันโปรแกรมของตัวเองด้วยการใช้ Obfuscation tool เครื่องมือดังกล่าวจะเข้ารหัสข้อมูลสายอักขระ รวมถึงเปลี่ยนโค้ดให้ไม่สามารถอ่านได้ แต่วิธีนี้ ก็ไม่สามารถป้องกันช่องโหว่ได้ทั้งหมด

ของโดยสรุป การเก็บรหัสผ่านผู้ใช้ให้ปลอดภัยมีหลักดังนี้
เมื่อระบบต้องการให้มีการกู้รหัสเมื่อผู้ใช้ลืมรหัส ใช้วิธีเข้ารหัสก่อนเก็บลงฐานข้อมูล
เมื่อต้องการ และระบบความปลอดภัยมากๆ ไม่ต้องการให้กู้รหัส ใช้วิธีเก็บค่าแฮชของรหัสผ่าน ทั้งการเข้ารหัสและการเก็บค่าแฮชให้ใช้ควบคู่กับ SALT


แหล่งที่มา http://www.siamcoding.com