เรียน Go ภาษาง่าย 📘

🔐

เจาะลึก Security + Crypto ใหม่ใน Go ฉบับภาษาง่าย

HPKE, ML-KEM, TLS, crypto/rand

7 บท
10 ข้อสอบ
1. อัป Go ก่อน = แพตช์แล้ว

Go 1.27.1 (1 ก.ย. 2026) มีแก้ crypto/x509 html/template net/url os + 1.26.1 แก้ชุดเดียวกัน ถ้ายังอยู่ 1.22-1.25 แปลว่ายังโหว่อยู่:

bash
go version # อยากเห็น go1.27.1
✏️ แบบทดสอบท้ายบท
แบบทดสอบท้ายบท
0/2


2. HPKE กล่องฝากของ (ใหม่ 1.26)

crypto/hpke (RFC 9180) = เข้ารหัสให้ "เปิดได้คนเดียว" มีแบบ hybrid กันควอนตัมด้วย:

go
import "crypto/hpke"
// ไอเดีย: เอากุญแจเขา -> seal กล่อง -> ส่งไป มีแต่เขาที่ open ได้
// มี mlkemtest + cryptotest ไว้เทสต์ (testing/cryptotest ใหม่ 1.26)

ใช้เมื่อ: ส่งไฟล์/โทเคนข้ามเครื่องโดยไม่ตั้งรหัสผ่านร่วมกันมาก่อน

✏️ แบบทดสอบท้ายบท
แบบทดสอบท้ายบท
0/2


3. ML-KEM + TLS hybrid กันควอนตัม

ตั้งแต่ 1.26 crypto/tls เปิด hybrid key exchange (X25519+ML-KEM) เป็นค่าเริ่มต้น คุยกับเว็บสมัยใหม่ปลอดภัยขึ้นเองโดยไม่แก้โค้ด:

go
// โค้ดเดิมได้ของใหม่เอง
http.Get("https://example.com")

ถ้าเจอ server เก่ามากคุยไม่ติด ค่อยผ่อนชั่วคราวเพื่อไล่บั๊ก (แต่อย่าปิดถาวร ควรอัป server):

GODEBUG=tlssecpmlkem=0
✏️ แบบทดสอบท้ายบท
แบบทดสอบท้ายบท
0/2


4. URL เข้มขึ้น + วิธีผ่อน

net/url 1.26 ปัดตก URL แปลกๆ ที่มี : ผิดที่ใน host มากขึ้น กันยิงมั่ว/หลอก:

go
u, err := url.Parse(input)
if err != nil {
    // 1.26 อาจ error กับของที่เมื่อก่อนผ่าน
}

ต้องรับของเก่าจริงๆ ค่อยผ่อนชั่วคราว:

GODEBUG=urlstrictcolons=0

แล้วรีบแก้ต้นทางดีกว่า

✏️ แบบทดสอบท้ายบท
แบบทดสอบท้ายบท
0/2


5. ล้างความลับ runtime/secret + เช็กลิสต์

1.26 มีทดลอง runtime/secret ไว้ลบ key ใน memory ให้เกลี้ยง (กันหลุดไปอยู่ใน dump) สายทำ wallet/auth ควรรู้ชื่อไว้

เช็กลิสต์ก่อนขึ้นโปรดักชัน:

  • อยู่ 1.27.1 + go mod tidy
  • go vet + go fix (มี unsafefuncs เตือนใช้ unsafe)
  • ไม่ log secret/token เต็มๆ ใช้ slog + มาสก์
  • input นอกทั้งหมดผ่าน url.Parse + เช็ก err
  • TLS ใช้ค่าเริ่มต้น (hybrid) ไม่ลดเวอร์ชันเองถ้าไม่จำเป็น

อ้างอิง: Go 1.26 (hpke, mlkem, tls hybrid, url colons, secret), Go 1.27 + 1.27.1 milestone

✏️ แบบทดสอบท้ายบท
แบบทดสอบท้ายบท
0/2


ภาคผนวก: ตัวอย่างเพิ่ม + Best Practices
ตัวอย่างเพิ่ม 1: สุ่ม token ต้องใช้ crypto/rand
go
b := make([]byte, 32)
if _, err := rand.Read(b); err != nil { // crypto/rand ไม่ใช่ math/rand
    log.Fatal(err)
}
token := hex.EncodeToString(b)
ตัวอย่างเพิ่ม 2: เทียบ secret แบบกันจับเวลา
go
sum := sha256.Sum256([]byte(password + salt))
if subtle.ConstantTimeCompare(sum[:], stored[:]) != 1 {
    return errors.New("รหัสผิด") // เทียบแบบกัน timing attack
}
ตัวอย่างเพิ่ม 3: ล็อก TLS ขั้นต่ำ
go
srv := &http.Server{
    Addr: ":443",
    TLSConfig: &tls.Config{
        MinVersion: tls.VersionTLS12, // ไม่รับ TLS 1.0/1.1 เก่า
    },
}
Best practices เช็กลิสต์
  • อัป Go = ได้แพตช์ security ฟรี อย่าดองเวอร์ชัน
  • secret สุ่มด้วย crypto/rand เท่านั้น ห้าม math/rand
  • เทียบ secret/hash ด้วย ConstantTimeCompare กัน timing attack
  • รหัสผ่านเก็บเป็น hash (salt ทุกอัน) ไม่เก็บตรง
  • TLS อย่าลด MinVersion เอง ใช้ค่า default (hybrid พร้อมควอนตัม)
  • validate/escape URL input ทุกครั้ง (กัน open redirect/traversal)
  • ไม่ log token/secret เต็ม (mask ตรงกลาง)
แบบฝึกหัด
  • ทำ token reset รหัสผ่าน (สุ่ม + หมดอายุ 15 นาที)
  • รีวิวโค้ดตัวเองหา 3 จุดที่ log ความลับแล้วแก้