Cryptology Academy · บทเรียน

ข้อผิดพลาดที่พบบ่อยในการเข้ารหัสด้วย Python และรูปแบบที่ปลอดภัย

หลีกเลี่ยงคีย์ที่เขียนตายตัว โหมด ECB การเปรียบเทียบที่ไม่ใช้เวลาคงที่ และปัญหาอื่น ๆ

บทเรียน 4 จาก 413 ขั้นตอน

ข้อผิดพลาดที่พบบ่อยในการเข้ารหัสด้วย Python และรูปแบบที่ปลอดภัย เป็นบทเรียน Cryptology Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cryptology Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน

ข้อผิดพลาดด้านการเข้ารหัสที่อันตรายที่สุด

การเข้ารหัสใช้งานผิดวิธีได้ง่าย ข้อผิดพลาดที่พบบ่อยที่สุดใน Python ได้แก่ กุญแจที่ฝังตายตัว โหมด ECB การเปรียบเทียบที่ไม่ใช้เวลาคงที่ การสุ่มที่อ่อนแอ การใช้กุญแจหรือนอนซ์ซ้ำ และการสร้างการเข้ารหัสขึ้นเอง

ข้อผิดพลาดที่ 1: กุญแจที่ฝังตายตัว

ห้ามฝังกุญแจไว้ในซอร์สโค้ดโดยเด็ดขาด กุญแจอาจไปปรากฏในประวัติ git บันทึกการทำงาน และข้อความแสดงข้อผิดพลาด ควรใช้ตัวแปรสภาพแวดล้อมหรือ KMS:

# WRONG
SECRET_KEY = b"my_secret_key_12"  # visible in git!

# RIGHT
import os
SECRET_KEY = os.environb.get(b"SECRET_KEY") or os.urandom(32)
# Or load from KMS at startup

ข้อผิดพลาดที่ 2: โหมด ECB

AES-ECB เข้ารหัสแต่ละบล็อกอย่างอิสระจากกัน ดังนั้นบล็อกข้อความต้นฉบับที่เหมือนกันจะให้บล็อกข้อความเข้ารหัสที่เหมือนกัน การโจมตีแบบ "เพนกวิน ECB" จะเปิดเผยรูปแบบในภาพและข้อมูลที่มีโครงสร้าง ควรใช้ GCM หรือ CBC ที่มี IV แบบสุ่มเสมอ

# WRONG — never use ECB
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
cipher = Cipher(algorithms.AES(key), modes.ECB())  # insecure!

# RIGHT
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
aesgcm = AESGCM(key)  # authenticated encryption

ข้อผิดพลาดที่ 3: การเปรียบเทียบ MAC ที่ใช้เวลาไม่คงที่

การใช้ == เพื่อเปรียบเทียบ MAC จะรั่วไหลข้อมูลด้านเวลา ควรใช้ hmac.compare_digest เสมอ:

import hmac

# WRONG — leaks timing
if received_mac == expected_mac:
    pass

# RIGHT — constant-time
if hmac.compare_digest(received_mac, expected_mac):
    pass

ข้อผิดพลาดที่ 4: การสร้างตัวเลขสุ่มที่อ่อนแอ

ห้ามใช้โมดูล random เพื่อวัตถุประสงค์ด้านการเข้ารหัสโดยเด็ดขาด เนื่องจากไม่ใช่ CSPRNG ควรใช้ secrets หรือ os.urandom:

import random, secrets, os

# WRONG
key = bytes([random.randint(0, 255) for _ in range(32)])  # predictable!

# RIGHT
key = os.urandom(32)          # OS CSPRNG
token = secrets.token_bytes(32)  # secrets module wrapper

ข้อผิดพลาดที่ 5: การใช้ IV หรือนอนซ์ซ้ำ

การใช้ IV ซ้ำกับ CBC หรือนอนซ์ซ้ำกับ GCM จะทำลายความปลอดภัย ควรสร้าง IV หรือนอนซ์สุ่มค่าใหม่สำหรับการเข้ารหัสทุกครั้ง และจัดเก็บไว้พร้อมกับข้อความเข้ารหัส:

import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)

# WRONG — fixed nonce
nonce = b"\x00" * 12  # reuse breaks GCM!

# RIGHT — fresh nonce every time
nonce = os.urandom(12)
ciphertext = aesgcm.encrypt(nonce, b"data", None)

ข้อผิดพลาดที่ 6: การใช้ MD5 หรือ SHA-1 เพื่อความปลอดภัย

MD5 และ SHA-1 ถูกทำลายด้านความต้านทานต่อการชนกันทางการเข้ารหัสแล้ว ห้ามใช้ทั้งสองแบบกับลายเซ็นดิจิทัล ลายนิ้วมือใบรับรอง หรือ HMAC โดยเด็ดขาด ควรใช้ SHA-256 หรือ SHA-3-256

ข้อผิดพลาดที่ 7: การสร้างการเข้ารหัสขึ้นเอง

การพัฒนาองค์ประกอบพื้นฐานด้านการเข้ารหัสตั้งแต่เริ่มต้นแทบจะนำไปสู่ข้อผิดพลาดที่ตรวจพบได้ยากเสมอ ควรใช้แพ็กเกจ cryptography, PyNaCl หรือ PyCA ห้ามพัฒนา AES, RSA หรือ ECDSA ขึ้นเองโดยเด็ดขาด

รูปแบบที่ปลอดภัย: PyNaCl สำหรับการเข้ารหัสระดับสูง

PyNaCl ครอบไลบรารี NaCl/libsodium และมี API ที่กำหนดแนวทางการใช้งานชัดเจนและใช้งานผิดได้ยาก:

# pip install PyNaCl
import nacl.secret
import nacl.utils

key = nacl.utils.random(nacl.secret.SecretBox.KEY_SIZE)
box = nacl.secret.SecretBox(key)

encrypted = box.encrypt(b"my secret message")
decrypted = box.decrypt(encrypted)
print("Decrypted:", decrypted)  # Uses XSalsa20-Poly1305

รูปแบบที่ปลอดภัย: การแฮชรหัสผ่านด้วย Argon2

ใช้ argon2-cffi สำหรับการแฮชรหัสผ่าน และห้ามใช้ SHA-256 หรือ bcrypt โดยตรง:

# pip install argon2-cffi
from argon2 import PasswordHasher

ph = PasswordHasher(time_cost=3, memory_cost=65536, parallelism=4)
hash_val = ph.hash("user_password")
print("Hash:", hash_val[:40], "...")

# Verify
try:
    ph.verify(hash_val, "user_password")
    print("Password correct")
except Exception:
    print("Wrong password")

การล้างค่ากุญแจออกจากหน่วยความจำ

หลังจากใช้กุญแจในหน่วยความจำแล้ว ให้เขียนทับด้วยศูนย์เพื่อลดช่วงเวลาที่อาจถูกโจมตีด้วยการดัมพ์หน่วยความจำ ตัวเก็บขยะของ Python ทำให้การดำเนินการนี้ทำได้ยาก ควรใช้ ctypes หรือ PyNaCl ซึ่งจัดการเรื่องนี้ให้อัตโนมัติ

ตรวจสอบความรู้

ต้องใช้ฟังก์ชัน Python ใดแทน == เมื่อต้องเปรียบเทียบ MAC ทางการเข้ารหัส

สรุปบทเรียน

หลีกเลี่ยงกุญแจที่ฝังตายตัว โหมด ECB การใช้ == เพื่อเปรียบเทียบ MAC โมดูล random และการใช้นอนซ์ซ้ำ ใช้ os.urandom/secrets สำหรับการสุ่ม ใช้ AESGCM สำหรับการเข้ารหัส และใช้ hmac.compare_digest สำหรับการตรวจสอบ PyNaCl และ argon2-cffi มี API ระดับสูงที่ปลอดภัยสำหรับการเข้ารหัสสมมาตรและรหัสผ่าน

เริ่มต้นได้ฟรี

เรียนรู้ Cryptology Academy ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
67
บทเรียน
261

คำถามที่พบบ่อย

บทเรียน “ข้อผิดพลาดที่พบบ่อยในการเข้ารหัสด้วย Python และรูปแบบที่ปลอดภัย” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ข้อผิดพลาดที่พบบ่อยในการเข้ารหัสด้วย Python และรูปแบบที่ปลอดภัย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cryptology Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ข้อผิดพลาดที่พบบ่อยในการเข้ารหัสด้วย Python และรูปแบบที่ปลอดภัย”

หลีกเลี่ยงคีย์ที่เขียนตายตัว โหมด ECB การเปรียบเทียบที่ไม่ใช้เวลาคงที่ และปัญหาอื่น ๆ คุณปฏิบัติ Cryptology Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cryptology Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cryptology Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ข้อผิดพลาดที่พบบ่อยในการเข้ารหัสด้วย Python และรูปแบบที่ปลอดภัย” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Cryptology Academy นี้ได้ไหม

ได้ บทเรียน Cryptology Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ภาพรวมไลบรารีการเข้ารหัสของ Python
  2. เข้ารหัสและถอดรหัส AES-GCM ใน Python
  3. คู่คีย์ RSA และ ECDSA ใน Python
  4. ข้อผิดพลาดที่พบบ่อยในการเข้ารหัสด้วย Python และรูปแบบที่ปลอดภัย
← กลับไปที่ Cryptology Academy