> For the complete documentation index, see [llms.txt](https://www.saladpuk.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.saladpuk.com/basic/security101.md).

# Security พื้นฐาน

ในคอร์สนี้เราจะมาพูดกันถึงเรื่อง **Security ขั้นพื้นฐาน**ในการทำซอฟต์แวร์ โดยเนื้อหาจะเน้นไปที่เรื่องความเข้าใจและหลักในการปฏิบัตินะจ๊ะ

## 🦉 นิทานเรื่องแรก

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

**ปัญหาของเรื่องมีอยู่ว่า**

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

จากปัญหาที่ว่ามา เจงกีสข่าน ก็เลยไปศึกษาเรื่อง **Cryptography 101** เลยได้วิธีการแก้ปัญหาทั้งหมดออกมาเป็นแบบนี้

### 💔 จดหมายโดนแอบอ่าน

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

เราเรียกหลักการนี้ว่าการทำ **Encryption** โดยเราจะเอาข้อความต้นฉบับที่อ่านได้ หรือที่เรียกว่า **Plain Text** ไปทำการเข้ารหัสด้วย **กุญแจลับ** แล้วสิ่งที่ได้ก็คือข้อความที่อ่านไม่ออก หรือที่เรียกว่า **Chipher Text** นั่นเอง ตามรูปเลย

![](/files/-Lw2EVjCx1ploSewvFJ3)

เช่น เจงกีสข่าน เขียนจดหมายไปว่า **เจอกันที่ใต้เข้าเหลียงซาน** เขาก็จะเอาข้อความที่เป็น Plain Text นี้ไปเข้ารหัสด้วยกุญแจลับ แล้วก็จะได้ Cipher Text ออกมาเป็นข้อความที่อ่านไม่ออกตามด้านล่างนี้

```
Tj/qsc0XaalXwMhfWWDFfC9kHlGNA/YQhTXDbu3jEC7jROmPKSNzhcRJTQtmQuTbqdosWtEK83XJhBO8cekh7YJiacffeMu7b+bEyvE+wlE=
```

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

![](/files/-M1lg24CAfY18yb9p1EG)

{% hint style="success" %}
**เทียบกับโลกจริง**\
การป้องกันการถูกแอบอ่านจดหมายนั้นมีไว้เพื่อป้องกันไม่ให้ มีคนแอบมารู้รหัสลับต่างๆที่เราส่งผ่าน network/internet ยังไงล่ะ เช่น เวลาเราใส่รหัสผ่าน ข้อมูลบัตรเครดิต อะไรพวกนี้ยังไงล่ะ ซึ่งนอกจากการป้องกันโดยการใช้ encryption ต่างๆแล้ว ช่องทางในการรับส่งข้อมูลก็ต้องเป็นช่องทางพิเศษด้วยนะ เช่น สังเกตุดีๆเวลาที่เราจะใส่รหัสผ่านกับเว็บอะไรก็ตาม มันจะต้องอยู่บน **HTTPS** ด้วย เพราะนั่นคือ secure channel ยังไงล่ะ แต่ถ้าเว็บไหนตอนที่เราใส่ความลับนั้นไม่ได้อยู่บน HTTPS ให้โปรดรู้ไว้เลยว่า คุณอาจจะโดนดักความลับอยู่ก็เป็นได้
{% endhint %}

### 💔 จดหมายถูกแก้ไข

เจงกีสข่านจำได้ว่าตอนไปกู้เงินโดนคนอื่นแอบโกงโดยการเติมเลขศูนย์ต่อท้ายลงไป ทำให้ต่อมาเขาต้องเขียนกำกับลงไปเป็นข้อความด้วยว่าเขากู้เงินไปจริงๆเท่าไหร่ เช่น 200 (สองร้อยบาทถ้วน) เพื่อเป็นการเอาไว้ตรวจสอบ ตอนที่มีคนไปแอบแก้เลข 200 เป็น 20,000 ก็จะไม่มีผลเพราะมันเขียนไว้แล้วว่า สองร้อยบาทถ้วน ดังนั้นเจงกีสข่านเลยเอาหลักการที่ว่ามาใช้นั้นก็คือการทำให้ **ข้อความสามารถถูกตรวจสอบได้** นั่นเอง โดยหลักการนี้เราเรียกมันว่าการทำ **HASH** นั่นเอง

ดังนั้นในจดหมายที่ส่งไป มันจะมีของที่สามารถตรวจสอบเจ้าจดหมายได้ว่ามันถูกแก้ไขหรือเปล่า ซึ่งถ้ามันถูกแก้ไข ผลตรวจก็จะบอกว่าจดหมายนั้นถูกแก้ไขนั่นเอง (รายละเอียดอ่านด้านล่างต่อ)

หลักการ HASH function นั้นแสนจะเรียบง่าย นั่นคือ การเอาข้อความธรรมดา ไปผ่านกระบวนการ hash แล้วเราจะได้ ข้อความอีกแบบกลับมานั่นเอง

เช่น เอาข้อความว่า **saladpuk** ไปผ่าน hash function เราก็จะได้ผลลัพท์ประมาณนี้ออกมา

```
6e1033fe5939f2659d21a51b27a41a14
```

และการทำ hash มันจะมีเรื่องพิเศษของมันคือ

**1.ผลลัพท์เดิมเสมอ**\
ถ้าเอาข้อความเดิมไปผ่านการ hash ไม่ว่าจะทำกี่ที ก็จะได้ผลลัพท์เดิมเสมอ เช่นคำว่า `saladpuk` *\*\**&#xE44;ม่ว่ายังไงเราก็จะได้ผลลัพท์กลับมาเป็นตัวด้านล่างอยู่ดี

```
6e1033fe5939f2659d21a51b27a41a14
```

แต่ถ้าเอาคำว่า `Saladpuk` (ตัวแรกเป็นตัว S ใหญ่) ไปผ่าน hash function ผลลัพท์ที่ได้กลับมาจะเป็นคนละโลกกันเลย

```
fce7659c775781e2e3b979799e0ee0d6
```

**2.อาจะได้ผลลัพท์เดียวกัน**\
ข้อความต่างกันอาจจะได้ผลลัพท์เดียวกันก็ได้ เช่น เอาคำว่า **`Helloworld`** ไปผ่านการ hash อาจจะได้ผลลัพท์เดียวกับ การเอาคำว่า **`saladpuk`** ไป hash ก็ได้ (เป็นแค่ตัวอย่างนะ)

**3.ไม่สามารถทำ reverse engineer ได้**\
เราไม่สามารถเอาผลลัพท์กลับมาหาว่า ข้อความก่อน hash คืออะไรได้เลย

**4.ขนาดตายตัว**\
ไม่ว่าข้อความจะยาวแค่ไหนก็ตาม ผลลัพท์ที่ได้จากการ hash จะมีความยาวเท่ากันเสมอ เช่นเอาคำว่า **demo hash function with a long long message** ไปผ่าน hash function ผลลัพท์ที่ได้ก็จะยาวเท่ากับตัวอย่างแรกเสมอ

```
ab9003e1e895c62ab2c73f9f550a5275
```

จากที่ว่ามาทั้ง 4 ข้อเราก็สรุปออกมาเป็นภาพได้ราวๆนี้

![](/files/-LwlKiHGNbXOqflVRkZV)

### 💔 จดหมายปลอม

เพื่อป้องกันการปลอมแปลงเอกสาร เจงกิสข่านเลยให้แม่ทัพของเขาลงตราประทัพประจำกองทัพเอาไว้ ดังนั้นถ้าจดหมายนั้นมีตราประทับอยู่ก็น่าจะเป็นจดหมายจากแม่ทัพของเขาจริงๆยังไงล่ะ ซึ่งการทำแบบนี้เขาเรียกว่าการทำ **Digital Signature**

โดยหลักในการทำ Digital Signature นั้นจะใช้หลักการที่เล่าให้ฟังทั้ง 2 เรื่องคือ **Encryption & Description** และ **HASH** มาร่วมกันทำ Digital Signature นั่นเอง

แต่ในรอบนี้การเข้ารหัสจะทำการสร้างกุญแจออกมา 2 ดอก เราเรียกมันว่า **กุญแจคู่** เพราะเจ้ากุญแจทั้งสองอันนี้มันเกิดมาคู่กัน ไม่สามารถหากุญแจอันไหนมาแทนที่ได้นั่นเอง โดยลักษณะพิเศษของมันคือ ถ้าเอากุญแจอันนึงไปเข้ารหัสข้อความเสร็จแล้ว เกิดอยากถอดรหัสขึ้นมาจะต้องใช้กุญแจอีกดอกถอดรหัสเท่านั้น นั่นคือสาเหตุว่าทำไมมันถึงเรียกมันว่ากุญแจคู่นั่นเอง โดยเราเรียกกุญแจแบบนี้ว่า **Public-Key Cryptography** โดยคนสร้างกุญแจจะเก็บมันไว้กับตัว 1 ดอกซึ่งเราเรียกมันว่า **Private Key** เพราะคนสร้างจะเก็บมันไว้อย่างดีไม่ให้ใครนั่นเอง ส่วนอีกดอก เราเรียกว่า **Public Key** ซึ่งเขาจะมอบให้กับคนอื่นเพื่อเอาไว้เปิดอ่านข้อความของเขา ซึ่งถ้าข้อความนั้นถูกเปิดด้วย public key ของเขาได้ นั่นแสดงว่าคนที่เขียนคือเจ้าตัวแน่นอนนั่นเอง

![](/files/-LrnTfXa1dJ7BNnRk8PT)

โดยหลักการทำงานของฝั่งที่จะเขียนจดหมายลับจะต้องทำตามในรูปนี้

![](/files/-Lw9IgP_SXuMLK3YVB_7)

**อธิบายรูป**

1. ฝ่ายผู้สร้างเขียนจดหมายจะต้องนำข้อความในจดหมายไปผ่าน HASH function เสียก่อน เพื่อให้สามารถตรวจสอบได้ว่าข้อความจะต้องเป็นแบบนี้เท่านั้นนะ เพราะถ้าข้อความถูกแก้ไข มันจะทำให้ผลลัพท์ของ hash เปลี่ยนไปนั่นเอง
2. ทำการเข้ารหัสด้วย **Private Key** เพื่อไม่ให้คนอื่นอ่านออก และเป็นการยืนยันว่าคนที่ส่งเกิดจากคนที่ใช้ private key นี้เท่านั้น ซึ่งมันก็เหมือนกับเป็นการลงลายเซ็นไปในตัว เพราะถ้าจะเปิดอ่านจะต้องใช้ public key ของเขาเท่านั้น ดังนั้นผลลัพท์ที่ได้จะเป็น ข้อความ และ สิ่งที่ตรวจสอบข้อความได้ว่ามันถูกแก้ไขหรือเปล่านั่นเอง

ถัดมาฝั่งที่รับจดหมายก็จะทำการตรวจสอบ ตามขั้นตอนในรูปด้านล่างนี้

![](/files/-LnhJerykJrZXzk31u5k)

**อธิบายรูป**

1. ผู้รับจดหมายก็จะเอาจดหมายไปทำการถอดรหัสด้วย **Public key** ที่คนเขียนได้ส่งมอบให้ ซึ่งถ้าใช้กุญแจนี้เปิดได้ก็แสดงว่าคนส่งคือคนที่ใช้ private key คู่ตรงข้ามของมันเท่านั้น ส่วนผลลัพท์จากการถอดรหัสจะได้ข้อความและผลลัพท์ของการ hash ออกมา
2. ผู้รับจดหมายก็จะลองเอาข้อความที่ได้ไปทำการ hash ซ้ำอีกครั้ง เพื่อดูผลลัพท์จากการ hash ว่าตรงกับ hash ที่อยู่ในจดหมายหรือเปล่า ซึ่งถ้าตรงกันก็แสดงว่าจดหมายไม่ได้ถูกแก้ไข และ มาจากคนส่งที่ถูกต้องจริงๆนั่นเอง

## 🎯 บทสรุป

### 🔥 Encryption & Description

เป็นการเข้ารหัสและถอดรหัส เพื่อป้องกันไม่ให้คนอื่นรู้ข้อความว่าเรากำลังคุยอะไรกันอยู่ ซึ่งเจ้าตัวนี้ก็จะแตกย่อยออกเป็นหลายๆแบบเลย เช่น **Symmetric** **Encryption** หรือ **Asymmetric Cryptography** ซึ่งรายละเอียดลองไปศึกษาดูต่อกับแต่ละภาษาที่ถนัดเอาละกันนะ

{% hint style="success" %}
**แนะนำให้อ่าน**\
สำหรับสาย .NET Developer แนะนำให้อ่านเรื่อง Cryptography จากทาง Microsoft โดยตรงได้เลยครับจากลิงค์ด้านล่างนี้\
[Microsoft document - Cryptography models](https://docs.microsoft.com/en-us/dotnet/standard/security/cryptography-model)
{% endhint %}

### 🔥 HASH

เป็นการแปลงข้อความตัวนึงให้กลายเป็นอีกตัวนึง โดยมีหลายวิธีการเช่นกัน เช่น MAC ก็จะเป็นตระกูล MD5, SHA1 หรือพวก HMAC ก็จะเป็นตระกูล HMAC-256, SHA-2, SHA-3 ไรงี้

{% hint style="danger" %}
**ข้อควรระวัง**\
ในเรื่องการทำ Security นั้นจะมีการอัพเดทมาเป็นระยะๆว่า algorithm แบบไหนที่ไม่ควรใช้แล้ว เช่น **MD5, SHA-1** ไรงี้เราไม่ควรใช้แล้วนะครับ เพราะมันมีคนทำ map table ไว้จนหมดแล้ว ถ้าแค่เค้าเห็นผลลัพท์เขาก็จะรู้ข้อความลับของเราได้เลยโดยที่ไม่ต้องไปถอดรหัสอะไรเลย (ใช้เวลาไม่ถึงวิ) ก็แทบจะเรียกว่าเราเก็บ plain text ไว้เลยก็ว่า
{% endhint %}

### 🔥 รวมๆ

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