ข้อผิดพลาดที่พบบ่อยในการเข้ารหัสด้วย Python และรูปแบบที่ปลอดภัย
หลีกเลี่ยงคีย์ที่เขียนตายตัว โหมด ECB การเปรียบเทียบที่ไม่ใช้เวลาคงที่ และปัญหาอื่น ๆ
ข้อผิดพลาดที่พบบ่อยในการเข้ารหัสด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ภาพรวมไลบรารีการเข้ารหัสของ Python
- เข้ารหัสและถอดรหัส AES-GCM ใน Python
- คู่คีย์ RSA และ ECDSA ใน Python
- ข้อผิดพลาดที่พบบ่อยในการเข้ารหัสด้วย Python และรูปแบบที่ปลอดภัย