เข้ารหัส / ถอดรหัส AES

วางข้อความและ passphrase เพื่อเข้ารหัสหรือถอดรหัส AES อย่างรวดเร็วด้วย PHP OpenSSL cipher ที่เลือก AES เป็น block cipher แบบสมมาตรที่ NIST กำหนดเป็นมาตรฐานใน FIPS 197 และใช้ในระบบ TLS, WPA2, VPN และ disk encryption จำนวนมาก แต่หน้านี้เป็นเครื่องมือสะดวกสำหรับข้อความความเสี่ยงต่ำ ไม่ใช่ที่เก็บ secret ที่ผ่านการ audit สำหรับไฟล์สำคัญหรือ secret ที่ต้องเก็บนาน ให้ใช้เครื่องมือ offline เช่น age, GnuPG หรือ 7-Zip

วิธีเข้ารหัสข้อความด้วย AES

  1. 1

    เลือก OpenSSL cipher

    ตัวเลือกปัจจุบันมี CBC, CTR และ GCM หลายแบบ CBC และ CTR ไม่มีการ authenticate และเครื่องมือนี้ไม่เก็บหรือตรวจสอบ tag การ authenticate ของ GCM

  2. 2

    ใส่ passphrase

    passphrase จะถูก hash ด้วย SHA-256 หนึ่งครั้งเพื่อสร้าง AES key ไม่มี PBKDF2, salt, Argon2 หรือ work factor ดังนั้นควรใช้ passphrase ที่ยาวและสุ่ม

  3. 3

    วางข้อความความเสี่ยงต่ำ

    นี่คือเครื่องมือของเรา ที่ทำงานฝั่ง server อย่าวางรหัสผ่าน production key เอกสารส่วนตัว หรือ secret ที่คุณไม่อยากส่งให้เว็บไซต์นี้

  4. 4

    คัดลอกผลลัพธ์ Base64

    ตอนเข้ารหัส เครื่องมือจะสร้าง IV แบบสุ่ม วางไว้หน้าข้อความเข้ารหัสดิบ แล้วเข้ารหัส byte รวมเป็น Base64 การถอดรหัสต้องใช้ cipher และ passphrase เดิม

เครื่องมือนี้สร้างผลลัพธ์อะไรจริง ๆ

การทำงานนี้ใช้ PHP OpenSSL เมื่อเข้ารหัส เครื่องมือจะ hash passphrase ด้วย SHA-256 สร้าง IV แบบสุ่มตามความยาวที่ cipher ที่เลือกต้องการ เข้ารหัสข้อความ แล้วคืนค่า:

Base64(IV || ข้อความเข้ารหัส)

ผลลัพธ์ ไม่มี salt, พารามิเตอร์ PBKDF2, HMAC หรือ tag การ authenticate ของ GCM จึงไม่เข้ากันกับ format จาก Web Crypto, age, GnuPG, สูตร command-line ของ OpenSSL หรือ 7-Zip

ตัวเลือก AES ในบริบท

AES มี block size คงที่ 128 bit (16 byte) และ key size มาตรฐาน 128, 192 และ 256 bit ความต่างด้านความปลอดภัยที่สำคัญตรงนี้ไม่ใช่แค่ขนาด key แต่คือข้อความที่เข้ารหัสมีการ authenticate หรือไม่

ตัวเลือก cipher สิ่งที่ควรรู้ในเครื่องมือนี้
AES-128-CBC / AES-192-CBC / AES-256-CBC mode แบบ block ที่ใช้ IV แบบสุ่มและ PKCS#7 padding ต้องมี MAC แยก เช่น HMAC-SHA-256 เพื่อจับการแก้ไขข้อมูล
AES-256-CTR ทำให้ AES ทำงานคล้าย stream mode ต้องมีการ authenticate แยก และห้ามใช้ IV/counter เดิมกับ key เดิมซ้ำ
AES-128-GCM / AES-256-GCM โดยปกติ GCM เป็น AEAD mode แต่ต้องเก็บและตรวจสอบ tag การ authenticate ด้วย ผลลัพธ์ของเครื่องมือนี้ไม่มี tag นั้น จึงอย่าพึ่งพาเป็น authenticated encryption

ข้อเตือนด้านความปลอดภัย

คำแนะนำด้าน cryptographic storage ของ OWASP แนะนำให้ใช้ authenticated encryption เมื่อทำได้ หรือใช้ encryption พร้อม MAC แยกต่างหาก โปรดจำไว้เมื่อใช้เครื่องมือนี้:

  • นี่คือการเข้ารหัสแบบสมมาตร - passphrase เดียวกันใช้ถอดรหัส ควรส่ง passphrase ผ่านช่องทางคนละช่องกับข้อความเข้ารหัส
  • passphrase อ่อนจะกลายเป็น key อ่อนในเครื่องมือนี้ - SHA-256 เร็วและไม่มี salt หากผู้โจมตีได้ผลลัพธ์ไปก็ลองเดาได้เร็ว
  • CBC และ CTR ต้องมีการยืนยันความถูกต้อง - หากไม่มี HMAC หรือ MAC อื่น ผู้โจมตีอาจแก้ข้อความเข้ารหัสได้โดยไม่ถูกตรวจพบ
  • อย่าใช้ IV หรือ nonce ซ้ำกับ key เดิม - เครื่องมือสร้าง IV สุ่มใหม่ตอนเข้ารหัส แต่ข้อมูลภายนอกที่นำมาวางก็ต้องทำตามกฎเดียวกัน
  • ใช้เครื่องมือที่ audit แล้วสำหรับ secret จริง - age, GnuPG และ 7-Zip จัดการ file format, metadata และ authentication ได้รอบคอบกว่า

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

component ปัจจุบัน hash passphrase ด้วย SHA-256 และใช้ byte ที่ได้เป็น key material ให้ OpenSSL ไม่ได้ใช้ PBKDF2, salt, scrypt หรือ Argon2 ดังนั้น passphrase ที่สั้นหรือใช้ซ้ำจึงเสี่ยง

ไม่ CBC และ CTR ต้องมี MAC แยก เช่น HMAC-SHA-256 แม้ GCM ปกติจะให้ AEAD authentication แต่เครื่องมือนี้ไม่เก็บหรือตรวจสอบ GCM tag ในผลลัพธ์ Base64

เกิดบน server ของเว็บไซต์เมื่อ action เรียก PHP OpenSSL นี่ไม่ใช่เครื่องมือ Web Crypto ที่ทำงานเฉพาะในเบราว์เซอร์ ดังนั้นอย่าวาง secret มูลค่าสูง private key หรือเอกสารอ่อนไหว

ผลลัพธ์ Base64 มี IV แบบสุ่มตามด้วยข้อความเข้ารหัสดิบ CBC padding อาจเพิ่ม byte และ Base64 ทำให้ข้อมูลไบนารีใหญ่ขึ้นประมาณหนึ่งในสาม รูปแบบที่บันทึกไม่มี salt หรือ authentication tag

เครื่องมือนี้จัดการเฉพาะข้อความ และควรใช้กับข้อความสั้นที่มีความเสี่ยงต่ำเท่านั้น สำหรับไฟล์หรือ secret สำคัญ ให้ใช้เครื่องมือเข้ารหัส offline ที่ผ่านการ audit เช่น age, GnuPG หรือ 7-Zip

เครื่องมือที่เกี่ยวข้อง

เครื่องมือเข้ารหัสซีซาร์

เข้ารหัสและถอดรหัสข้อความด้วยรหัสซีซาร์ เลื่อนได้ตั้งแต่ 1-25 รองรับ ROT13 เป็นกรณีพิเศษ และคงเครื่องหมายวรรคตอนกับตัวพิมพ์ใหญ่-เล็กไว้เหมือนเดิม

ตัวเข้ารหัสและถอดรหัส Base58

เข้ารหัสข้อความ UTF-8 หรือไบต์เลขฐานสิบหก และถอดรหัส Base58 อย่างปลอดภัยด้วยชุดอักขระ Bitcoin, Ripple หรือ Flickr

ตัวสร้าง bcrypt

สร้าง bcrypt hash จากรหัสผ่าน plaintext ปรับ cost factor ได้ตั้งแต่ 4 ถึง 13 ใช้ร่วมกับ Laravel, Django, Node และ PHP ได้

ตัวเข้ารหัสและถอดรหัส Base85

เข้ารหัสและถอดรหัส Base85 ในรูปแบบ Adobe Ascii85 ซึ่งใช้ในไฟล์ PostScript และ PDF กะทัดรัดกว่า Base64 สำหรับข้อมูลไบนารี

ตัวเข้ารหัสไฟล์ Base64

เข้ารหัสไฟล์ใดก็ได้ (PDF, ZIP, รูปภาพ, ไฟล์ปฏิบัติการ) เป็นข้อความ Base64 เพื่อฝังใน JSON, อีเมล, YAML หรือ data URI ทำงานในเครื่องของคุณ ไม่มีการอัปโหลด

ตัวสร้าง bcrypt Hash

สร้าง bcrypt hash หรือตรวจสอบรหัสผ่าน plaintext กับ bcrypt hash ที่มีอยู่ โหมด generate และ verify อยู่ข้างกันในเครื่องมือเดียว