บทนำ
ในการเก็บข้อมูลที่สำคัญหรือเป็นความลับในคอมพิวเตอร์นั้น เพื่อให้มีความปลอดภัยจากการเข้าถึงของบุคคลที่ไม่เกี่ยวข้อง หรือจากการขโมยข้อมูล เราควรมีการทำ Cryptography เพื่อปกป้องข้อมูลของเรา
Cryptography เป็นศาสตร์ของการแปลงอักขระที่มีความหมายให้เป็นอักขระที่ไม่มีความหมาย ทำให้มนุษย์ไม่สามารถอ่านออกได้
ศาสตร์นี้มีมานานหลายปีแล้ว มีมาก่อนคอมพิวเตอร์เสียอีก ซึ่ง Microsoft เองนั้นได้พัฒนา API สำหรับการทำ Cryptography มาตั้งแต่ Windows 95 จนมาถึง .NET ได้มีคลาสใหม่ๆ ซึ่งห่อหุ้ม Algorithm ในการทำ Cryptography ไว้ เพื่อให้ง่ายในการใช้งาน ผ่าน property และ method
มารู้จักกับ Hash Algorithm
หากคุณต้องการเก็บ password ให้ปลอดภัยจากการมองเห็น คุณจะต้องสร้าง hash ของข้อมูล
Hash เป็น Algorithm แบบทางเดียว หรือ one-way algorithm ในการแปลงข้อมูล ซึ่งเมื่อแปลงข้อมูลไปแล้วจะไม่สามารถแปลงข้อมูลกลับไปเป็นข้อมูลก่อนที่จะแปลงได้อีก
นักพัฒนาส่วนใหญ่ใช้ฐานข้อมูลในการเก็บ password ซึ่งทำให้ผู้ที่มีสิทธิในการเข้าถึงข้อมูลสามารถมองเห็น password ในฐานข้อมูลได้ ดังนั้นควร hash password ก่อน แล้วจึงค่อยเก็บลงในฐานข้อมูล เมื่อ user ป้อน password จึงค่อย hash password ที่ user ได้ป้อนเข้ามา และนำไปเปรียบเทียบกับ hash data ที่เก็บอยู่ในฐานข้อมูลอีกที ดังนั้นจะไม่สามารถดู password ของ user ได้ว่าคืออะไร เพราะมันได้ถูก hash ไว้แล้ว และไม่สามารถแปลงกลับมาเพื่ออ่านได้อีก
การ hash เป็นกระบวนการที่เปลี่ยนข้อมูลเดิมเล็กน้อย และเข้ากระบวนการผลิต hash data ออกมา โดยข้อมูลที่ต่างกันจะได้ hash data ที่ไม่เหมือนกัน และเป็นไปไม่ได้เลยที่จะได้ hash data ที่เหมือนกัน
สำหรับนักพัฒนาของ .NET แล้วมีวิธีการทำ hash ให้เลือกใช้มากมาย แต่ที่พบเห็นโดยทั่วไปหรือใช้บ่อยๆ คือ SHA1 และ MD5
ตัวอย่างโค้ดของฟังก์ชัน SHA1 (ต้อง import the namespace System.Security.Cryptography ด้วย)
Private Function HashText(ByVal TextToHash As String) As String
Dim SHA1 As SHA1CryptoServiceProvider
Dim bytValue() As Byte
Dim bytHash() As Byte
' สร้างอ๊อบเจ็คของ Crypto Service Provider
SHA1 = New SHA1CryptoServiceProvider
' แปลงจาก String ไปเป็น array ของ byte
bytValue = System.Text.Encoding.UTF8.GetBytes(TextToHash)
' ทำการ Hash ซึ่งจะคืนค่าออกมาเป็น array ของ byte
bytHash = SHA1.ComputeHash(bytValue)
SHA1.Clear()
' คืนค่า String จาก hash value
Return Convert.ToBase64String(bytHash))
End Function
ถ้าให้ Hash ข้อมูลคำว่า “Paul” จะได้ hash data คือ
w2h6uYgMJt/nq5ZqihcBteAXwv8=
แต่ถ้าเป็นคำว่า “Pauly” จะได้ hash data คือ
proywxJ0znMpGF5sbB18+7GSAsM=
จะเห็นได้ว่า แม้ข้อความจะเปลี่ยนไปเพียงเล็กน้อย เมื่อทำการ hash ข้อมูลออกมากลับทำให้ hash data แตกต่างกันอย่างสิ้นเชิง ด้วยวิธีการนี้ทำให้การ hash มีประโยชน์มาก ซึ่งทำให้ยากในการหารูปแบบหรือในการถอดข้อมูลดั้งเดิมออกมาจากข้อมูลที่เข้ารหัสไว้แล้วได้
ส่วน MD5 นั้นจะเหมือนกับ SHA1 เปลี่ยนแต่ Provider เท่านั้น
Private Function HashTextMD5(ByVal TextToHash As String) As String
Dim md5 As MD5CryptoServiceProvider
Dim bytValue() As Byte
Dim bytHash() As Byte
md5 = New MD5CryptoServiceProvider
bytValue = System.Text.Encoding.UTF8.GetBytes(TextToHash)
bytHash = md5.ComputeHash(bytValue)
md5.Clear()
Return Convert.ToBase64String(bytHash))
End function
การเลือกใช้ Hash Algorithm
กลไกของการ hash ข้อมูลแต่ละวิธีนั้นมีรูปแบบการทำงานคล้ายกัน แต่มีความแตกต่างอยู่ที่ขนาดของ key ที่ใช้ในการสร้าง hash หากใช้ key ที่ใหญ่ขึ้นก็จะทำให้การเข้ารหัสมีความซับซ้อนมากขึ้น
- SHA1 ใช้ keyขนาด 160 – bit
- MD5 ใช้ keyขนาด 120 – bit
อีกประเด็นหนึ่งในการพิจารณา คือ ความเป็นไปได้ในการชนกัน (Collision) ของ hash data ทั้งในทางทฤษฎีและในทางปฏิบัติ ซึ่งการชนกันนั้น คือ คำ 2 คำเมื่อทำการ hash แล้วได้ Hash data เดียวกัน
- SHA1 ไม่มีความเป็นไปได้ในการชนกันเลยทั้งทางทฤษฎีและทางปฏิบัติ
- MD5 มีโอกาสชนกันได้ในทางทฤษฎี แต่ในทางปฏิบัติไม่มีโอกาสชนกันเลย
พบกันใหม่ในตอนที่ 2 ครับ
.
No comments:
Post a Comment