คำแนะนำในการเก็บรหัสผ่านในระบบสำหรับนักพัฒนาซอฟต์แวร์ และผู้ดูแลระบบไอที

คำแนะนำนี้เหมาะสำหรับนักพัฒนาซอฟต์แวร์ และผู้ดูแลระบบไอทีเป็นสำคัญ สำหรับบุคคลทั่วไปแนะนำให้อ่าน ตั้งรหัสผ่านอย่างไรให้ปลอดภัย แทนนะครับ

จริงๆ เจอเคสในการเก็บรหัสผ่านเป็นแบบ plaintext หรือเก็บรหัสผ่านแล้วสามารถย้อนกลับเป็น plaintext เดิมๆ ได้โดยง่าย ซึ่งผมเจอเคสแบบนี้บ่อยค่อนข้างมาก และคิดว่าควรจะเขียนเรื่องนี้สักครั้งหนึ่ง

หลักของการเก็บรหัสผ่านในฐานข้อมูลนั้น

1. ไม่ใช่การเก็บตัวรหัสผ่านจริงๆ ลงไป

2. ไม่ควรใช้การจัดเก็บรหัสผ่านที่สามารถย้อนกลับมาเป็นรหัสผ่านต้นทางได้ ไม่ว่าจะทางใดก็ทางหนึ่ง

หลักง่ายๆ ก่อน 2 ข้อนี้ ทำให้เกิดวิธีคิดในการเก็บรหัสผ่านเพียงแค่ hash (หรือบางเอกสารเรียก fingerprint หรือค่า message digest) ของรหัสผ่านนั้นๆ กล่าวคือ การกระทำใดๆ ในตัวระบบ ต้องไม่มีความสามารถที่สามารถย้อนกลับวิธีการได้มาซึ่งข้อมูล hash ได้ (Non-invertibleเพื่อเป็นการป้องกันรหัสผ่านที่แท้จริงจากการนำไปใช้งานได้ทันทีหลังจากระบบถูก hack แล้วถูก dump ข้อมูลเหล่านี้ออกไป เพราะแม้ว่ารหัสผ่านที่ถูกนำออกไปจะเป็นเพียงแค่ hash ของข้อมูล แต่การโจมตีแบบ rainbow table attacks ก็สามารถถอดรหัสผ่านใดๆ ที่เป็นเพียงแค่ค่า hash ย้อนกลับมาเป็นรหัสผ่านเดิมได้ไม่ช้าก็เร็ว เพราะแม้มีความเป็นไปได้น้อยมากๆ แต่ก็ถือว่ามีความเสี่ยง

หลักการขอ rainbow table attacks คล้ายๆ การ brute force รหัสผ่านโดยทั่วไป แต่เป็นการกระทำต่อ hash เป็นหลัก โดยสุ่มชุดข้อมูลที่คิดว่าเป็นรหัสผ่าน มาเข้าขั้นตอน hash ที่เป็นที่นิยมใช้ให้ได้ซึ่งค่า hash แล้วเอาชุดข้อมูลดังกล่าว ใส่ลงในฐานข้อมูล rainbow tableไว้ แล้วเมื่อมีการ hack ระบบเกิดขึ้นแล้วได้ชุดข้อมูล hash ที่ dump ออกมา ก็เอาไปทดสอบเทียบกับชุดข้อมูลในฐานข้อมูลที่สร้างไว้ก่อนหน้านี้ ก็จะย้อนกลับมาได้ว่า ข้อมูล plaintext ที่เป็นส่วนย้อนกลับของ hash มีค่าใด

หากแต่การปรับปรุงและใช้ขั้นตอนของการใดมาซึ่งค่า hash ที่ยาวขึ้น มีความซับซ้อนมากขึ้น ไม่ใช้ขั้นตอนตามมาตรฐานเพียงอย่างเดียว มีการผสมชุดข้อมูลอื่นๆ ที่สร้างขึ้นจากระบบด้วยแล้วการถูก rainbow table attacks ก็มีความเสี่ยงน้อยลงไปอีก

โดยด้านล่างเป็นลักษณะของฟังค์ชั่นโดยทั่วไปที่มักใช้กัน

[hash] = [salt] + [hash_function([salt] + [password])]

[salt] = เป็นการสุ่มจากวิธีการสุ่มใดๆ ที่ปลอดภัยที่สุดเท่าที่ทำได้ คำแนะนำคือควรใช้วิธีการสุ่มจากฟังค์ชั่นแบบ Cryptographically Secure Pseudo-Random Number Generator (CSPRNG)

[hash_function] ก็เลือกว่าจะเอาตัวไหนก็ได้ แต่ที่ใช้ๆ กันก็ แต่พวก MD5 หรือ SHA-1 ที่มันหาง่าย แต่มันก็แข็งแรงน้อยลงมากๆ ไม่แนะนำ และเดี่ยวนี้มันพูดกันที่ระดับ SHA-2 กันไปแล้ว (SHA-2 = SHA-256 หรือ SHA-512)

จริงๆ สูตรฟังค์ชันด้านบนนั้น มีชุดคำสั่งสำเร็จรูปที่นิยมกันที่ชื่อ PBKDF2 เพราะมีการกำหนดชุดการฟังคัชันในการ hash, จำนวนรอบในการสุ่ม และกำหนดความยาวของ hash ได้หลากหลาย ทำให้ยากมากขึ้นในการได้มากซึ่ง plaintext ที่แท้จริงจาก rainbow table

hash= PBKDF2(hash_function_name, password, salt, iterations, length)

ส่วนการใช้งานตอนเปรียบเทียบรหัสผ่านที่ผู้ใช้กรอกเข้ามา กับ hash ที่ระบบเก็บไว้ ก็ตรงไปตรงมา ก็แค่นำรหัสผ่านที่ผู้ใช้กรอกเข้ามาเข้าวิธีการเดิมที่ได้มาซึ่ง hash เดิม แล้วนำมาเปรียบเทียบว่าตรงกันหรือไม่

โดยการทำแบบนี้ “ช่วยให้ผู้ใช้งานทั้งระบบยังพอมีเวลาในการปรับเปลี่ยนรหัสผ่านชุดใหม่ได้ใน ระยะเวลาที่น่าจะปลอดภัยมากที่สุด” เพราะหากว่ากันตามความเป็นจริงแล้ว ในวงการด้านการเข้ารหัสข้อมูลนั้น ทราบกันดีว่า ไม่มีวิธีการใดอะไรที่สามารถเข้ารหัสข้อมูลได้ปลอดภัยที่สุดไปตลอดกาล เพราะเทคโนโลยีด้านการคำนวนของ CPU/GPU นั้นเร็วมากขึ้นทุกวัน การจัดเก็บข้อมูลที่ปลอดภัยในช่วงเวลาหนึ่งอาจไม่ปลอดภัยในอีกไม่กี่ปีต่อมา เพราะเราสามารถแกะ และคำนวนหาค่าต่างๆ หรือสุ่มชุดข้อมูลต่างๆ ได้เร็วและหลายหลากขึ้น ตาม CPU/GPU ที่เร็วขึ้นเพื่อมาสร้าง rainbow table ได้ทุกขณะ

ทั้งหมดที่กล่าวมา เป็นเพียงแค่การทำความเข้าใจเริ่มต้นของแนวคิดในการเก็บรหัสผ่านในระบบเท่านั้น แนะนำให้อ่านข้อมูลเพิ่มเติมจาก keyword ต่างๆ ในบทความนี้เพิ่มเติม เพื่อทำความเข้าใจในทุกขั้นตอนต่อไป

อ้างอิง

เว็บ se-ed.com เก็บรหัสผ่านสมาชิกของร้านเป็น plaintext!

เมื่อวานนั่งหาหนังสือ กะว่าจะสั่งหนังสือสัก 2-3 เล่ม แต่ลืมรหัสผ่าน se-ed.com เลยเข้า https://www.se-ed.com/forgot-password.aspx เพื่อขอขั้นตอนการปลดล็อคผ่านทางอีเมลเพื่อเข้าระบบ

2014-09-08_110337

 

แต่สิ่งที่ได้กลับมาทำให้ตกใจไม่น้อยเพราะ….

2014-09-08_110831

 

ก็ไม่รู้จะว่ายังไงดี ความอยากได้หนังสือหายไปในทันที เลิกสั่งตั้งรหัสผ่านใหม่ที่ยาวกว่าเดิม แล้วลาก่อนเว็บนี้

ส่วนเหตุผลว่าทำไมอ่านจากของเก่าได้ที่ อย่าไว้ใจเว็บแบรนด์ระดับโลกให้เก็บรหัสผ่านที่สำคัญของคุณ

ใช้จ่ายผ่าน internet ควรรู้ความเสี่ยง ระมัดระวัง และรู้วิธีการแก้ไขปัญหา

ปรกติเวลาผมชำระเงินผ่าน internet ผมมักเลือก Paypal เป็นอันดับแรกหากมี แต่ถ้าไม่มีผมจะใช้บัตรเครดิตอย่าง KTC, Citibank, UOB หรือ AEON เป็นหลัก เพราะมีระบบแจ้งเตือนเมื่อชำระเงินผ่าน internet และมักมีการโทรมาสอบถามยอดใช้จ่ายผ่าน internet อยู่ตลอด ซึ่งบางครั้งเร็วมากในระดับวินาที กดจ่ายเงินไปปั๊บ ไม่เกิน 10 วินาที จะมีเจ้าหน้าที่โทรมาสอบถามทันที ซึ่งผมเจอกับ 4 แบรนด์นี้เป็นประจำ แม้จะไม่ทุกยอดที่ใช้จ่าย แต่หากเป็นยอดสั่งซื้อแปลกๆ มักไม่พลาด เช่นสั่งซื้อเพลงผ่าน iTunes สั่งซื้อแอพผ่าน Play Store หรือเว็บขายของอย่าง eBay เป็นต้น

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

การใช้บัตรเครดิตและระบบการชำระเงินผ่าน Paypal มีข้อดีในเรื่องของการช่วยระงับยับยั้งการจ่ายเงินสดออกไป และทำให้ยอดการใช้จ่ายถูกต้องเสมอ ควรศึกษาและทำความเข้าใจเรื่องพวกนี้ ผมเชื่อว่าเราจะรู้สึกปลอดภัยมากขึ้นในการใช้งานมันบน internet มากขึ้น

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

มองยังไงมาตรฐานอาชีพด้านไอซีทีที่กำลังจะเกิดขึ้น

จากข่าว มาตรฐานอาชีพด้านไอซีทีคลอดแล้ว ในช่วง 2-3 วันที่ผ่าน พอเข้าไปดูที่ โครงการจัดทำมาตรฐานอาชีพและคุณวุฒิวิชาชีพ “สาขาวิชาชีพเทคโนโลยีสารสนเทศและการสื่อสารและดิจิตอลคอนเทนต์” ก็พอทราบรายละเอียดว่า มาตรฐานนี้จัดโดยสถาบันคุณวุฒิวิชาชีพ (องค์การมหาชน) แน่นอนว่าเป็นของใหม่ที่ไม่ทราบว่าสถาบันนี้มาได้อย่างไร เลยค้นข้อมูลก็พบรายละเอียดและแนวทางของสถาบันแห่งนี้ หากดูเนื้อหาทั้งหมดแล้วนั้น ในความคิดเห็นส่วนตัวไม่มีปัญหากับการสอบมาตรฐานประกอบวิชาชีพไอทีนะ คือมองว่ามันคือ certificate ตัวหนึ่งในตลาดที่นำไปใช้งานในการแวดวงราชการได้ ซึ่งผมมองว่าคงคล้ายๆ กับมาตรฐานวิชาชีพอื่นๆ เช่น ใบประกอบวิชาชีพวิศวกร ใบประกอบวิชาชีพครู ใบประกอบโรคศิลป์ ใบประกอบวิชาชีพเภสัช ใบประกอบวิชาชีพสถาปนิก ใบประกอบวิชาชีพบัญชี หรืออนุญาตประกอบวิชาชีพทนายความ เป็นต้น

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

ซึ่งหากสังเกตดีๆ อาชีพใดๆ ที่มีการสอบใบประกอบวิชาชีพมักจะยุ่งเกี่ยวกับหน่วยงานราชการเป็นสำคัญ โดยในภาคเอกชนคงไม่กระทบเท่าไหร่ เพราะสายงานนี้ก็รับกันด้วยการทดสอบ หรือดูที่ผลงานกันอยู่แล้ว แต่ภาคราชการจะกระทบมาก เพราะนักวิชาการ ระดับปฏิบัติการ ระดับชำนาญการ และระดับชำนาญการพิเศษ จะต้องสอบ และทำให้มาตรฐานสายงานไอทีในระดับนักวิชาการของหน่วยงานรัฐฯ มีมาตรฐานมากขึ้น ซึ่งส่วนตัวคิดว่าดีนะ เพราะใบประกอบวิชาชีพอื่นๆ ก่อนหน้านี้ หลายๆ ตัวก็ได้มาตรฐานที่ดี บางใบมีการต่ออายุใบประกอบวิชาชีพด้วย เพราะใบประกอบวิชาชีพเหล่านั้นมีวันหยดอายุ ต้องมาสอบเพื่ออัพเดทความรู้ตลอด ซึ่งก็ดีสำหรับวิชาการที่ก้าวไปข้างหน้าตลอดเวลา ซึ่งส่วนของไอทีแรกๆ คงมีข้อกังขาในช่วงแรกๆ แหละ ซึ่งคงใช้เวลาวัดกันว่ามาตรฐานที่สอบๆ กัน มันช่วยเพิ่มเติมความน่าเชื่อถือได้แค่ไหน

ฉะนั้นเรื่องการสอบมาตรฐานประกอบวิชาชีพไอที ผมมองว่ามันถูกผลักดันมาหลายรอบแล้ว แต่ก็ไม่สำเร็จ หรือเป็นท่แพร่หลายเสียเท่าไหร่ ก็ไม่รู้โครงการนี้จะเป็นโครงการสุดท้าย หรือว่าจะต้องทำโครงการแนวๆ นี้กันอีกสักกี่รอบเหมือนกัน ><“