สิ่งที่คุณต้องรู้เกี่ยวกับการเข้ารหัสใน Java



บทความนี้จะให้ความรู้โดยละเอียดและครอบคลุมเกี่ยวกับการเข้ารหัสใน Java และวิธีใช้กับตัวอย่าง

การเข้ารหัสเป็นวิธีการใช้อัลกอริทึมทางคณิตศาสตร์เพื่ออำพรางความหมายของข้อมูลเพื่อให้เฉพาะผู้ที่ได้รับอนุญาตเท่านั้นที่สามารถถอดรหัสได้ ในบทความนี้เราจะพูดถึงการเข้ารหัสและการถอดรหัสใน ตามลำดับต่อไปนี้:

บทนำเกี่ยวกับการเข้ารหัสใน Java

มีการใช้การเข้ารหัสเพื่อปกป้องข้อมูลของเรา (เช่นข้อความเสียงโฆษณาการสนทนา) ไม่ว่าจะนั่งอยู่บนคอมพิวเตอร์หรือส่งทางอินเทอร์เน็ต เทคโนโลยีการเข้ารหัสล่าสุดเป็นองค์ประกอบสำคัญของสภาพแวดล้อมการประมวลผลที่ปลอดภัย





บทบาทหลักของการรักษาความปลอดภัยของการเข้ารหัสอยู่ที่ความสามารถของอัลกอริทึมในการสร้าง ciphertext (ข้อความที่เข้ารหัส) ซึ่งยากที่จะเปลี่ยนกลับเป็นข้อความธรรมดาดั้งเดิม การใช้คีย์ยังสร้างความปลอดภัยอีกระดับให้กับวิธีการปกป้องข้อมูลของเรา คีย์คือข้อมูลบางส่วนซึ่งอนุญาตให้เฉพาะผู้ที่ถือรหัสนี้เพื่อเข้ารหัสและถอดรหัสข้อความ

การเข้ารหัสและถอดรหัสใน Java



อัลกอริทึมการเข้ารหัสแบบสมมาตร

อัลกอริทึม Symmetric ใช้คีย์เดียวกันในการเข้ารหัสและถอดรหัส อัลกอริทึมดังกล่าวสามารถทำงานได้เฉพาะในโหมดบล็อก (ซึ่งทำงานกับบล็อกข้อมูลขนาดคงที่) หรือโหมดสตรีม (ซึ่งทำงานกับบิตหรือไบต์ของข้อมูล) อัลกอริทึมดังกล่าวมักใช้สำหรับแอปพลิเคชันเช่นการเข้ารหัสข้อมูลการเข้ารหัสไฟล์และการเข้ารหัสข้อมูลที่ส่งในเครือข่ายการสื่อสาร (เช่น TLS อีเมลข้อความโต้ตอบแบบทันที ฯลฯ )

อัลกอริธึมการเข้ารหัสแบบไม่สมมาตร (หรือคีย์สาธารณะ)

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



ในการกำหนดค่ารูปแบบการเข้ารหัสพื้นฐานอย่างปลอดภัยจำเป็นอย่างยิ่งที่พารามิเตอร์ดังกล่าวทั้งหมด (อย่างน้อยที่สุด) ได้รับการออกแบบอย่างถูกต้อง:

  • การเลือกอัลกอริทึมที่ถูกต้องเป็นสิ่งสำคัญ
  • การเลือกโหมดการทำงานที่เหมาะสมสำหรับงานที่เหมาะสม
  • การเลือกรูปแบบช่องว่างภายในที่เหมาะสมตามความต้องการ
  • การเลือกคีย์และขนาดให้เหมาะสม
  • แก้ไขการเริ่มต้นด้วย CSPRING ที่เข้ารหัสลับ

เป็นสิ่งสำคัญมากที่จะต้องทราบถึงการกำหนดค่าพารามิเตอร์ทั้งหมดนี้อย่างปลอดภัย แม้แต่การกำหนดค่าที่ไม่ถูกต้องเพียงเล็กน้อยก็อาจเป็นอันตรายต่อระบบเข้ารหัสลับทั้งหมดและเปิดให้แฮกเกอร์และมัลแวร์อื่น ๆ โจมตีได้ ดังนั้นเพื่อให้การสนทนานี้ง่ายขึ้นขอให้เราพูดคุยเฉพาะการเริ่มต้น Cipher ที่ไม่ขึ้นกับอัลกอริทึม แทนที่จะทำการเข้ารหัสด้วยตัวเองจะเป็นการดีกว่าเสมอที่จะให้ผู้เชี่ยวชาญทำงานกำหนดค่าคอนฟิกูเรชันที่ขึ้นกับอัลกอริทึมมากขึ้นเช่นค่า p และ q ของอัลกอริทึม RSA เป็นต้นเพียงแค่กำหนดค่าพารามิเตอร์การเข้ารหัสพื้นฐานที่สูงกว่าครึ่ง ใช้คลาสหลายโหล

การแนะนำลำดับชั้นของคลาสตัวสร้าง / วิธีการที่มากเกินไปและอื่น ๆ เพิ่มความซับซ้อนมากมายซึ่งทำให้ไม่จำเป็น ฉันหวังว่า Java จะไม่ทำให้การกำหนดค่าพื้นฐานซับซ้อนและจะใช้สถาปัตยกรรมที่เรียบง่ายขึ้นเช่นเดียวกับ Microsoft โดยที่พารามิเตอร์ทั้งหมดดังกล่าวอยู่ภายในขอบเขตของ SymmetricAlgorithm คลาสเดียวและ AsymmetricAlgorithm สำหรับพารามิเตอร์สามตัวแรกที่ต้องระบุ (อัลกอริทึมโหมดการทำงานและโครงร่างช่องว่างภายใน) อ็อบเจ็กต์ Cipher จะใช้สตริงการแปลง

  • การเลือกอัลกอริทึมที่เหมาะสม

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

เมนูแบบเลื่อนลงในเชิงมุม js

อัลกอริทึมที่เหลืออาจเสียมากเกินไป (DES, RC2 และอื่น ๆ ) หรือรอยแตกเริ่มปรากฏขึ้น (RC5) ทำให้แตกได้โดยใช้พลังงาน CPU ที่เพียงพอซึ่งอาจพังได้แล้วเมื่อคุณอ่านสิ่งนี้ นักพัฒนาที่คำนึงถึงความปลอดภัยต้องไม่อ่านข้อมูลจำเพาะของ NIST หรือติดตามเหตุการณ์ล่าสุดและการวิจัยในชุมชนการเข้ารหัส พวกเขาอาจเลือกอัลกอริธึมที่เสียหรือมีความเสี่ยงตัวสร้างข้อมูลย่อยหรือหลอกสุ่ม

เสมอสำหรับ:

  1. Symmetric Algorithm: ใช้รหัสบล็อก AES / AESWrap

  2. Asymmetric Algorithm: ใช้ RSA

  • โหมดการทำงาน

โหมดการทำงานเป็นส่วนหนึ่งของการเปลี่ยนแปลงและเกี่ยวข้องกับการปิดกั้นรหัสเท่านั้น เมื่อเราใช้การเข้ารหัสแบบอสมมาตรให้ใช้ ECB เป็นโหมดการทำงานซึ่งโดยพื้นฐานแล้วเป็นการแฮ็กเบื้องหลังซึ่งหมายความว่าไม่ต้องสนใจค่านี้ ผู้ให้บริการ Java เช่น SunJCE, SunPKCS11 มีค่าเริ่มต้นเป็นโหมด ECB สำหรับอัลกอริธึมแบบสมมาตรและไม่สมมาตร อาจเป็นสิ่งที่ดีสำหรับอัลกอริทึมที่ไม่สมมาตร แต่เป็นความคิดที่ไม่ดีสำหรับบล็อกไซเฟอร์

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

ข้างต้นอัลกอริทึม AES จะใช้กับโหมดการทำงานของ ECB ทำให้การโจมตีซ้ำง่ายมาก สำหรับการพัฒนาใหม่หากมีความเป็นไปได้น้อยที่สุดในการปรับปรุงงานเก่าเราควรใช้การเข้ารหัสที่ผ่านการรับรองความถูกต้องกับโหมดข้อมูลที่เกี่ยวข้อง (AEAD) (ตัวอย่างเช่น GCM และ CCM) เรามีแท็กการตรวจสอบความถูกต้องที่มีความยาวเต็ม 128 บิต หากเราใช้โหมดที่ไม่ได้รับการรับรองความถูกต้องเราจะใช้ CBC หรือ CTR กับ MAC เพื่อพิสูจน์ตัวตนของการเข้ารหัส

  • การเลือกรูปแบบช่องว่างภายในที่เหมาะสม

โหมดการเข้ารหัสบล็อกทั่วไปต้องการความยาวของข้อความธรรมดาเพื่อให้มีขนาดบล็อกของอัลกอริธึมการเข้ารหัสพื้นฐานซึ่งแทบจะไม่เกิดขึ้น ดังนั้นเราต้องมีช่องว่างภายในโปรแกรม Java จัดเตรียมแผนการที่แตกต่างกันสามแบบสำหรับการเข้ารหัสแบบสมมาตรหนึ่งคือ No Padding ซึ่งเป็นที่ยอมรับไม่ได้และอีกแบบคือ ISO10126Padding ซึ่งถูกถอนออกไปตั้งแต่ปี 2550)

ดังนั้นตัวเลือกเดียวที่เหมาะสมคือการใช้ PKCS5Padding การผสมผสานระหว่างโหมดการทำงานบางโหมด (ตัวอย่างเช่นโหมด CBC) และรูปแบบการเติมแพดดิ้ง PKCS5 สามารถนำไปสู่การโจมตีช่องว่างภายใน การไม่กล่าวถึงรูปแบบการขยายช่องว่างเลยนั้นอันตรายกว่าการจัดเตรียมแผนการที่เสี่ยงต่อการโจมตีบางประเภทเท่านั้น แนะนำให้ใช้โหมด AEAD มากที่สุดเพื่อให้แน่ใจว่าคุณได้รับการป้องกันจากการโจมตีเหล่านี้

  • อัลกอริทึมแบบไม่สมมาตร

ในอัลกอริทึมที่ไม่สมมาตรเรามีตัวเลือกในการเลือกจากสองรูปแบบการเติม สิ่งสำคัญคือต้องตรวจสอบให้แน่ใจว่าใช้เฉพาะโครงร่าง OAEPWithAndPadding เท่านั้น ในกรณีย่อยโปรดใช้ SHA1 หรือ SHA256 / 384/512 สำหรับ Mask Generation Function (MGF) กรุณาใช้ MGF1 padding ตามที่ระบุ PKCS1Padding ที่มี RSA เสี่ยงต่อการโจมตี Ciphertext [6] ตั้งแต่ปี 1998

ที่นี่เราพูดถึงวิธีที่ถูกต้องในการใช้การแปลงในเมธอด“ Cipher.getInstance”

  • การเข้ารหัสแบบสมมาตร

  • การเข้ารหัสแบบไม่สมมาตร

สร้างสำเนาของวัตถุ java

ระดับความปลอดภัยของรูปแบบการเข้ารหัสจะแปรผันตรงกับขนาดของคีย์ ความยาวของกุญแจจะต้องยาวพอที่พลังเดรัจฉานจะโจมตีมันไม่สามารถทำได้ในเวลาเดียวกันก็ควรจะสั้นพอที่จะคำนึงถึงความเป็นไปได้ในการคำนวณ นอกจากนี้เราต้องพยายามพิจารณาถึงสิ่งที่ยังทนต่อความก้าวหน้าด้านการคำนวณในอีก 30 ปีข้างหน้า

ด้วยเหตุนี้เราจึงมาถึงตอนท้ายของบทความการเข้ารหัสใน Java ฉันหวังว่าคุณจะเข้าใจเกี่ยวกับการเข้ารหัสและถอดรหัสและเหตุใดจึงใช้ใน Java

ตรวจสอบไฟล์ โดย Edureka บริษัท การเรียนรู้ออนไลน์ที่เชื่อถือได้ซึ่งมีเครือข่ายผู้เรียนที่พึงพอใจมากกว่า 250,000 คนกระจายอยู่ทั่วโลก หลักสูตรการฝึกอบรมและการรับรอง Java J2EE และ SOA ของ Edureka ออกแบบมาสำหรับนักเรียนและผู้เชี่ยวชาญที่ต้องการเป็น Java Developer หลักสูตรนี้ออกแบบมาเพื่อให้คุณเริ่มต้นการเขียนโปรแกรม Java และฝึกอบรมแนวคิด Java ทั้งหลักและขั้นสูงพร้อมกับเฟรมเวิร์ก Java ต่างๆเช่น Hibernate & Spring

มีคำถามสำหรับเรา? โปรดระบุไว้ในส่วนความคิดเห็นของบล็อก 'การเข้ารหัสใน Java' และเราจะติดต่อกลับโดยเร็วที่สุด