Security in actions
😒 ก็รู้นะว่าสำคัญ แต่เขียนโค้ดเรื่องนี้ไม่เป็น
Last updated
😒 ก็รู้นะว่าสำคัญ แต่เขียนโค้ดเรื่องนี้ไม่เป็น
Last updated
ในบทความนี้เราจะมาดูการเขียนโค้ดด้าน Security ขั้นพื้นฐานกัน ว่ามีอะไรบ้างที่เราควรจะต้องรู้จัก และ จะเรียกใช้งานมันให้ถูกหลักได้ยังไงกันบ้าง ซึ่งบนความก่อนหน้า ดช.แมวน้ำ ได้สอนแนวคิดเรื่อง การเก็บรหัสผ่านที่ถูกต้อง ในแง่ทฤษฎีไปละ รอบนี้เราจะมาดูกันว่าแล้วเราจะเขียนโค้ดออกมาจริงๆยังไงนั่นเอง
แนะนำให้อ่าน บทความนี้เป็นส่วนหนึ่งของคอร์ส 👦 Security พื้นฐาน ถ้าเพื่อนๆสนใจอยากรู้หลักในการรักษาความปลอดภัยตั้งแต่เริ่มต้นเลย ก็กดอ่านที่ตัวสีฟ้าๆได้เลยนะ
ได้มีการทำสถิติของข้อมูลที่รั่วไหลตั้งแต่ปี 2013 ไว้แล้วพบว่า ข้อมูลที่รั่วออกไปมีแค่ 4% เท่านั้นที่ถูกทำเรื่อง security ไว้ นั่นหมายความว่าซอฟต์แวร์โปรเจคต่างๆไม่ค่อยได้ทำเรื่อง security นั่นเอง ซึ่งทำให้ ข้อมูลส่วนตัว
รหัสบัตรเครดิต
รหัสประชาชน
เบอร์โทร
ของหลายๆคนหลุดเข้าไปในตลาดมืดแล้วนั่นเองครัช
จากข้อมูลด้านบนจริงๆก็จะเหมารวมว่าเขาไม่ได้ทำเรื่อง Security ทั้งหมดก็ไม่ได้ แต่อาจเกิดจาก ทำไม่ถูกวิธี ก็เป็นได้ เช่น ถ้าเราไปหาเซิร์จตาม google เราก็จะพบคำแนะนำให้เราใช้ MD5 อยู่เต็มไปหมด (MD5 ปัจจุบันเราถือว่ามันไม่ปลอดภัยแล้ว) ดังนั้นเรามาลองดูกันว่าถ้าเราจะเขียนโค้ดในด้าน Security เขาเขียนยังไงกันบ้างกัลลล์
พื้นฐานของการทำเรื่อง Security คือการ สร้างความลับที่มีแต่เราเท่านั้นที่รู้ขึ้นมา ซึ่งโดยปรกติเราก็จะทำการเขียนโค้ดสุ่มเลขมั่วๆขึ้นมาซักอย่างเพื่อใช้มันเป็น กุญแจลับ นั่นเอง
ตัวอย่างกุญแจลับ เราอาจจะสุ่มเลข 0~9 ขึ้นมา 1 ตัวเพื่อใช้เป็นกุญแจลับของเราก็ได้ แต่มันก็จะไม่ปลอดภัยเพราะมันเป็นเลขหลักเดียว ดังนั้นเราก็อาจจะสุ่มมาซัก 15 หลัก เพื่อยากต่อการคาดเดาก็ได้ เพราะโอกาสที่คนอื่นจะเดารหัสลับของเราถูกนั้นมีแค่ 1 ใน 1,000 ล้านล้าน นั่นเอง
ซึ่งแค่สุ่มเลข 15 หลักก็ไม่คณามันสมองของเหล่าโปรแกรมเมอร์หรอก เขียนโค้ดแพร๊บ แกร๊กๆๆ
ยินดีด้วยคุณสอบ Security ตกเรียบร้อยแล้ว 🤣 ... ไม่ได้ล้อเล่นนะ โค้ดด้านบนไม่ได้มีอะไรผิดเบย แต่สิ่งที่ผิดคือ การเลือกใช้ Random ผิด เพราะการสุ่มในโลกของคอมพิวเตอร์นั้นสามารถคำนวณได้นั่นเอง ซึ่งมันหมายความว่าถ้ามีคนหลอกวิธีการคำนวณได้ การสุ่มก็จะไม่ใช่การสุ่มอีกต่อไปเพราะเขาสามารถเลือกได้ว่าอยากให้มันสุ่มออกมาเป็นเลขอะไรนั่นเอง
การสุ่มของคอมพิวเตอร์นั้นไม่มีอยู่จริง เพราะคอมมันคิดเองไม่ได้ มันเลยต้องไปอ่านค่าอะไรมาซักอย่าง เช่น ข้อมูลใน Memory, CPU, Network บลาๆ แล้วเอาของพวกนั้นมาประกอบกันเป็นเลขสุ่มให้เรานั่นเอง นั่นหมายความว่า ถ้าเรารู้ วิธีการสร้างเลข random เราก็สามารถกำหนดผลลัพท์ของมันได้นั่นเอง
ตัวอย่าง สมมุติว่าคลาส Random มันจะไปเอาเลขจาก Memory ที่ตำแหน่ง x มาบวกกับเลขใน CPU ที่ตำแหน่ง y โดยเอาเลขหลักหน่วยมาเป็นผลลัพท์ของการสุ่มเสมอ คราวนี้เราอยากให้มันสุ่มเลขอะไร เราก็แค่ไปกำหนดค่าใน Memory, CPU ในตำแหน่งนั้นๆ เราก็จะได้ผลลัพท์ที่เรา lock ไว้แล้วนั่นเอง
ข้อเสียของการ Random ที่สามารถคำนวณได้คือ มันไม่ปลอดภัย เพราะว่าถ้าเกิดเครื่องเรามีไวรัสฝังอยู่แล้วตอนที่เราไปสร้างกุญแจลับปุ๊ป พวกไวรัสก็เพียงแค่ไปกำหนดค่าตามวิธีการคำนวณของการ random ก็เป็นอันจบเลย เพราะคนร้ายสามารถเลือกได้ว่าจะสร้างกุญแจอะไรให้เรา
เนื่องจากการสุ่มโดยทั่วไปที่เราใช้เขียนโค้ดนั้นถูกคำนวณได้ ดังนั้นก็มีคนคิดวิธีทำให้มันสุ่มในสุ่มซ้อนกันไปทำให้เกิดการคาดเดาไม่ได้ว่าจริงๆแล้วการสุ่มรอบนี้จะไปอ่านค่าอะไร ตำแหน่งไหน สูตรในรอบนี้จะใช้อะไร บลาๆ ซึ่งข้อดีคือมันสามารถป้องกันการถูกกำหนดผลลัพท์ได้ แต่ก็ต้องแลกมากับความช้าในการสร้างนั่นเอง ซึ่งการสุ่มแบบนี้ในแต่ละภาษาจะมี library เฉพาะทางของมันเอง เช่นใน .NET ก็จะเป็น System.Security.Cryptography
นั่นเอง ดังนั้นการสุ่มที่ปลอดภัยในสาย .NET นั้นต้องใช้คลาส RNGCryptoServiceProvider
เข้ามาช่วย ซึ่งก็จะได้ผลลัพท์ออกมาเช่นนี้ครัช
เนื่องจากช่วงนี้ ดช.แมวน้ำ ติดภาระกิจจนเกือบไม่มีเวลานอนมาตั้งแต่ต้นปี 2021 ละ แต่ด้วยหลายๆอย่างเลยอยากแชร์ความรู้ให้เพื่อนๆ ดังนั้นกระป๋มจะขอซอยเป็นบทย่อยๆเอาละกันนะกั๊ฟ
คอร์สนี้กำลังค่อยๆเขียนอยู่ ใครที่ไม่อยากพลาดอัพเดทก็เข้าไปกดติดตามที่ลิงค์นี้ Mr.Saladpuk ได้เลย
HMAC Functions
Salt & Pepper
Key Derivation
Symmetric Encryption
Asymmetric Encryption
Digital Signature
Security in Practice
เกลียด ชอบ ถูกใจ อยากติดตาม อยากติชมแนะนำด่าทอ หรืออะไรก็แล้วแต่ (ห้ามมายืมเงิน) จิ้มลงมาที่เพจนี้ได้เลย Mr.Saladpuk และจะเป็นประคุณอันล้นพ้นถ้ากด Like + Follow + Share ให้ด้วยขอรับ น้ำตาจิไหล 🥺