บทความนี้ส่วนใหญ่แนะนำอัลกอริทึมการเข้ารหัสที่ใช้กันทั่วไปสำหรับการใช้งาน Java - อัลกอริทึมการเข้ารหัสแบบทางเดียว MD5 และ SHA ดังต่อไปนี้:
1. สถาปัตยกรรมความปลอดภัยของ Java
1.1 บทนำสู่สถาปัตยกรรมความปลอดภัยของ Java
จัดเตรียมคลาสและอินเทอร์เฟซสำหรับกรอบความปลอดภัยใน Java JDK Security API เป็น API หลักของภาษาการเขียนโปรแกรม Java ซึ่งตั้งอยู่ในแพ็คเกจ Java.security (และแพคเกจย่อย) รวมถึงแพ็คเกจ Sun.securityapi (และแพคเกจย่อย) ออกแบบมาเพื่อช่วยให้นักพัฒนาใช้คุณสมบัติด้านความปลอดภัยทั้งในระดับต่ำและขั้นสูงในโปรแกรมของพวกเขา
การเปิดตัว JDK ครั้งแรกใน JDK 1.1 ได้เปิดตัว "Java Encryption Architecture" (JCA) ซึ่งหมายถึงสถาปัตยกรรมที่ใช้ในการเข้าถึงและพัฒนาฟังก์ชั่นรหัสผ่านแพลตฟอร์ม Java ใน JDK 1.1, JCA มี API สำหรับลายเซ็นดิจิตอลและการย่อยข้อความ JDK 1.2 ขยายสถาปัตยกรรมการเข้ารหัส Java อย่างมากนอกจากนี้ยังอัพเกรดโครงสร้างพื้นฐานการจัดการใบรับรองเพื่อรองรับใบรับรอง X.509 V3 และแนะนำสถาปัตยกรรมความปลอดภัย Java ใหม่สำหรับการควบคุมการเข้าถึงที่มีความละเอียดมีความยืดหยุ่นและยืดหยุ่นได้
สถาปัตยกรรมการเข้ารหัส Java รวมถึงส่วนที่เกี่ยวข้องกับรหัสผ่านของ API ความปลอดภัย JDK 1.2 รวมถึงชุดการประชุมและข้อกำหนดที่ให้ไว้ในเอกสารนี้ ในการใช้รหัสผ่านที่ใช้งานร่วมกันได้หลายรายการมันยังมีสถาปัตยกรรม "ผู้ให้บริการ"
การขยายรหัสผ่าน Java (JCE)) ขยาย JCA API รวมถึง API สำหรับการเข้ารหัสการแลกเปลี่ยนคีย์และรหัสการตรวจสอบข้อมูล (MAC) รหัสผ่าน JCE และ JDK ร่วมกันจัดเตรียม API รหัสผ่านที่สมบูรณ์ซึ่งไม่เกี่ยวข้องกับแพลตฟอร์ม JCE ในฐานะส่วนขยายของ JDK จะได้รับการปล่อยตัวอย่างอิสระเพื่อให้สอดคล้องกับข้อ จำกัด การควบคุมการส่งออกของสหรัฐอเมริกา
1.2 ซอร์สโค้ดที่เกี่ยวข้องของ JDK ใน Eclipse
เพื่อให้มีความเข้าใจที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับการดำเนินการของอัลกอริทึมการเข้ารหัสแบบทางเดียว MD5 และ SHA ใน Java ซอร์สโค้ดของ JDK สามารถเชื่อมโยงกับการใช้ Eclipse IDE (ผู้เขียนใช้ JDK6.0)
หลังจากการติดตั้ง JDK6.0 เสร็จสมบูรณ์แล้วจะมีไดเรกทอรี SRC.ZIP ในไดเรกทอรีรากของ JDK (เช่น C: /Java/JDK1.6.0_21) ไดเรกทอรีนี้สามารถคลายการบีบอัดไปยังไดเรกทอรีอื่น (เช่น D:/Amigo/การศึกษา/เรียงความทางเทคนิค/201405) SRC.ZIP ไม่มีซอร์สโค้ด JDK ทั้งหมด ตัวอย่างเช่นแพคเกจย่อยภายใต้ดวงอาทิตย์ไม่มีอยู่ใน SRC.ZIP (เช่นแพ็คเกจ Sun.Security และแพ็คเกจย่อยที่ใช้ในบทความนี้ไม่รวมอยู่)
ในการดาวน์โหลดแพคเกจย่อยเหล่านี้คุณต้องดาวน์โหลดซอร์สโค้ดของ OpenJDK OpenJDK เป็นเวอร์ชันโอเพ่นซอร์สของ JDK และเปิดตัวในรูปแบบของโปรโตคอล GPL ที่ JDK7 OpenJDK ได้กลายเป็นการพัฒนากระดูกสันหลังของ JDK7 Sun JDK7 ได้รับการปล่อยตัวบนพื้นฐานของ OpenJDK7 รหัสต้นฉบับส่วนใหญ่เหมือนกันและมีเพียงส่วนเล็ก ๆ ของรหัสต้นฉบับที่ถูกแทนที่ เผยแพร่โดยใช้ JRL (ใบอนุญาต Javaresearch, ข้อตกลงใบอนุญาตการวิจัย Java)
OpenJDK ดาวน์โหลดที่อยู่: //www.vevb.com/softs/75724.html
หลังจากดาวน์โหลดแล้วให้คัดลอกไฟล์และโฟลเดอร์ทั้งหมดใน Unzipped OpenJDK-6-SRC-B27-26_OCT_2012/JDK/SRC/Share/Classes Directory ไปยังไดเรกทอรี SRC Unzipped
ถัดไปกำหนดค่าซอร์สโค้ดที่เกี่ยวข้องใน Eclipse: คลิก "Windows"-> "การตั้งค่า" และเลือก "Java"-> "ติดตั้ง JRES" ในเมนูด้านซ้าย หาก JRE ของเครื่องนี้ได้รับการกำหนดค่าคุณไม่จำเป็นต้องกำหนดค่า หากไม่ได้กำหนดค่าให้คลิกปุ่ม "เพิ่ม" ทางด้านขวาและเลือกเส้นทางของหน้าต่าง JDK6.0 ที่ติดตั้งในหน้าต่างป๊อปอัพ "เพิ่ม JRE" (เช่น C: /java/jdk1.6.0_21) คลิกปุ่ม "ตกลง" เพื่อให้การตั้งค่าของ JRE เสร็จสิ้น
เลือกชุด JRE คลิกปุ่ม "แก้ไข ... " ทางด้านขวาเลือกแพ็คเกจ RT.JAR ในหน้าต่างป๊อปอัปคลิกปุ่ม "แหล่งที่มา ... " คลิกปุ่ม "โฟลเดอร์ภายนอก ... " ในหน้าต่างป๊อปอัพแล้วชี้เส้นทางซอร์สโค้ดไปยังเส้นทางของ SRC ตอนนี้ ดูรูปด้านล่าง:
หลังจากคลิกปุ่ม "ตกลง" เพื่อตั้งค่าเมื่อเขียนการใช้งานของ MD5 และ SHA เมื่อเรียกใช้วิธีการที่เกี่ยวข้องของ MessageGeSest คุณสามารถใช้การดีบักดีบั๊กโหมด F5 ขั้นตอนเดียวเพื่อดูคลาสที่เกี่ยวข้องกับการใช้งาน MD5 และ SHA แบบเดียวใน Java
1.3 คลาสหลักของการเข้ารหัส MD5 และ SHA ใน JDK
ใน JDK6.0 ไดอะแกรมคลาสของหลายชั้นเรียนที่เกี่ยวข้องอย่างใกล้ชิดกับ MD5 และ SHA มีดังนี้:
ในหมู่พวกเขา "MessageDigestSpi" เป็นคลาสนามธรรมระดับบนสุดและ "MessageGeSest" และ "DigestBase" ภายใต้แพ็คเกจเดียวกันคือคลาสย่อย
ในแผนภาพคลาสด้านบนจะใช้รูปแบบการออกแบบตัวแทน หลักการของรูปแบบนี้คือคลาส B (นี่คือคลาสตัวแทนภายใน) และคลาส A (นี่คือคลาส MessageDigestSpi) เป็นสองคลาสที่ไม่มีความสัมพันธ์ซึ่งกันและกัน B มีวิธีการและแอตทริบิวต์เดียวกับ A; และวิธีการโทรและแอตทริบิวต์ใน B คือการเรียกใช้วิธีการและคุณลักษณะที่มีชื่อเดียวกันใน A. B ดูเหมือนจะเป็นตัวกลางที่ได้รับอนุญาตจาก A. รหัสบุคคลที่สามไม่จำเป็นต้องรู้ว่าการมีอยู่ของ A และ subclasses และไม่จำเป็นต้องมีการเชื่อมต่อโดยตรงกับ A และ subclasses ผ่าน B ฟังก์ชั่นของ A สามารถใช้โดยตรงซึ่งไม่เพียง แต่สามารถใช้ฟังก์ชั่นต่าง ๆ ของ A แต่ยังปกป้อง A และคลาสย่อยได้ดี
รหัสที่เกี่ยวข้องสำหรับ MD5 และ SHA ทั้งหมดอยู่ในชั้นเรียนเช่น MD5 และ SHA แต่คลาสนามธรรมที่ลูกค้าหันมาใช้งานไม่จำเป็นต้องจัดการกับคลาสการใช้งานที่หลากหลายเพียงจัดการกับพวกเขาผ่านชั้นผู้แทน
2. การเข้ารหัส MD5
2.1 ภาพรวม
อัลกอริทึมการย่อยข้อความ MD5 (ชื่อภาษาจีนเป็นอัลกอริทึมการย่อยข้อความฉบับที่ห้า) เป็นฟังก์ชั่นแฮชที่ใช้กันอย่างแพร่หลายในด้านความปลอดภัยของคอมพิวเตอร์เพื่อให้การป้องกันความสมบูรณ์ของข้อความ หมายเลขไฟล์ของอัลกอริทึมนี้คือ RFC 1321 (R.Rivest, ห้องปฏิบัติการ MIT สำหรับวิทยาศาสตร์คอมพิวเตอร์และ RSA Data Security Inc. เมษายน 1992)
ชื่อเต็มของ MD5 คืออัลกอริทึมการระบุข้อความ 5 (อัลกอริทึมข้อมูล-ABSTRACT) พัฒนาโดย Ronald L. Rivest ของห้องปฏิบัติการ MIT สำหรับวิทยาศาสตร์คอมพิวเตอร์และ RSA Data Security Inc ในต้นปี 1990 และพัฒนาโดย MD2, MD3 และ MD4
MD5 ใช้เพื่อให้แน่ใจว่าการส่งข้อมูลที่สมบูรณ์และสอดคล้องกัน มันเป็นหนึ่งในอัลกอริทึมแฮชที่ใช้กันอย่างแพร่หลายโดยคอมพิวเตอร์ (แปลว่าเป็นอัลกอริทึมนามธรรมและอัลกอริทึมแฮช) ภาษาการเขียนโปรแกรมกระแสหลักมักใช้โดย MD5 การคำนวณข้อมูล (เช่นอักขระภาษาจีน) ลงในค่าความยาวคงที่อื่นเป็นหลักการพื้นฐานของอัลกอริทึมแฮช รุ่นก่อนของ MD5 คือ MD2, MD3 และ MD4
ฟังก์ชั่นของ MD5 คือการอนุญาตให้ข้อมูลความจุขนาดใหญ่ "บีบอัด" เป็นรูปแบบที่เป็นความลับก่อนที่จะลงนามคีย์ส่วนตัวด้วยซอฟต์แวร์ลายเซ็นดิจิตอล (นั่นคือเพื่อแปลงสตริงไบต์ที่มีความยาวใด ๆ เป็นสตริงเลขฐานสิบหกของความยาวที่แน่นอน)
2.2 หลักการอัลกอริทึม
คำอธิบายสั้น ๆ ของอัลกอริทึม MD5 สามารถเป็นดังนี้: MD5 ประมวลผลข้อมูลอินพุตในแพ็กเก็ต 512 บิตและแต่ละแพ็คเก็ตแบ่งออกเป็น 16 แพ็คเก็ตย่อย 32 บิต หลังจากการประมวลผลชุดเอาต์พุตของอัลกอริทึมประกอบด้วยแพ็คเก็ต 32 บิตสี่แพ็ค หลังจากเรียงซ้อนแพ็คเก็ต 32 บิตทั้งสี่นี้จะมีการสร้างค่าแฮช 128 บิต
ในอัลกอริทึม MD5 ข้อมูลจะต้องกรอกก่อนดังนั้นผลลัพธ์ของยอดคงเหลือที่เหลือของความยาวบิตคู่ 512 เท่ากับ 448 ดังนั้นความยาวบิตของข้อมูลจะขยายไปยัง N*512+448, n เป็นจำนวนเต็มที่ไม่ลบ วิธีการเติมมีดังนี้: เติม 1 และ 0s นับไม่ถ้วนที่อยู่เบื้องหลังข้อมูลและหยุดการกรอกข้อมูลด้วย 0 จนกว่าจะตรงตามเงื่อนไขข้างต้น จากนั้นความยาวของข้อมูลการเติมเต็มจะถูกแนบในไบนารี 64 บิต หลังจากการประมวลผลสองขั้นตอนเหล่านี้ความยาวบิตของข้อมูล = n*512+448+64 = (n+1)*512 นั่นคือความยาวเป็นจำนวนเต็มจำนวนเต็ม 512 เหตุผลสำหรับสิ่งนี้คือการปฏิบัติตามข้อกำหนดสำหรับความยาวของข้อมูลในการประมวลผลที่ตามมา
2.3 การใช้งาน MD5 ใน Java
การใช้งาน Java ของอัลกอริทึมการเข้ารหัส MD5 มีดังนี้:
แพ็คเกจ amigo.endecrypt; นำเข้า java.security.messagedigest;/*** ใช้การเข้ารหัส md5* @author xingxing, xie* @datetime 2014-5-31*/คลาสสาธารณะ md5util {/**** md5 encryption 32-bit md5 รหัส*/ สตริงคงที่สาธารณะ MD5ENCODE (String Instr) พ่นข้อยกเว้น {messageGeTest md5 = null; ลอง {md5 = messageGeSt.getInstance ("MD5"); } catch (exception e) {system.out.println (e.toString ()); E.PrintStackTrace (); กลับ ""; } byte [] byteArray = instr.getBytes ("UTF-8"); ไบต์ [] md5bytes = md5.digest (bytearray); StringBuffer hexValue = new StringBuffer (); สำหรับ (int i = 0; i <md5bytes.length; i ++) {int val = ((int) md5bytes [i]) & 0xff; ถ้า (val <16) {hexvalue.append ("0"); } hexvalue.append (integer.tohexstring (val)); } return hexvalue.toString (); } / ** * ทดสอบฟังก์ชั่นหลัก * @param args * @throws exception * / โมฆะคงที่สาธารณะหลัก (สตริง args []) โยนข้อยกเว้น {string str = สตริงใหม่ ("amigoxiexiexingxingxing"); System.out.println ("Original:" + Str); System.out.println ("MD5:" + MD5ENCODE (STR)); -ผลการทดสอบ:
ต้นฉบับ: amigoxiexiexingxing
Post-MD5: E9AC094091B96B84CCA48098BC21B1D6
3. การเข้ารหัส sha
3.1 ภาพรวม
SHA เป็นอัลกอริทึมการเข้ารหัสข้อมูล อัลกอริทึมนี้ได้รับการพัฒนาและปรับปรุงโดยผู้เชี่ยวชาญด้านการเข้ารหัสในช่วงหลายปีที่ผ่านมาและสมบูรณ์แบบมากขึ้นเรื่อย ๆ ตอนนี้ได้กลายเป็นหนึ่งในอัลกอริทึมการแฮชที่ปลอดภัยที่สุดที่ได้รับการยอมรับและถูกใช้อย่างกว้างขวาง แนวคิดของอัลกอริทึมนี้คือการรับข้อความธรรมดาแล้วแปลงเป็นข้อความรหัส (โดยปกติเล็กกว่า) ในวิธีที่กลับไม่ได้ นอกจากนี้ยังสามารถเข้าใจได้อย่างง่ายดายว่าเป็นกระบวนการของการใช้สตริงของรหัสอินพุต (เรียกว่า premapping หรือข้อมูล) และแปลงเป็นลำดับความยาวที่สั้นกว่าและเป็นตัวเลขหลักคงที่คือค่าแฮช (หรือที่เรียกว่าข้อมูลการย่อยข้อมูลหรือรหัสการตรวจสอบข้อมูล) ค่าฟังก์ชันแฮชสามารถกล่าวได้ว่าเป็น "ลายนิ้วมือ" หรือ "สรุป" ของข้อความธรรมดาดังนั้นลายเซ็นดิจิตอลของค่าแฮชถือเป็นลายเซ็นดิจิตอลของข้อความธรรมดา
อัลกอริทึม Hash Secure (SHA) เป็นมาตรฐาน National FIPS Pub 180 ที่ออกโดยสถาบันมาตรฐานและเทคโนโลยีแห่งชาติ มาตรฐานล่าสุดได้รับการปรับปรุงให้เป็น FIPS PUB 180-3 ในปี 2008 ในหมู่พวกเขาอัลกอริทึมการแฮชแบบทิศทางเดียวหลายอย่างเช่น SHA-1, SHA-224, SHA-256, SHA-384 และ SHA-512 SHA-1, SHA-224 และ SHA-256 เหมาะสำหรับข้อความที่มีความยาวไม่เกิน 2^64 บิตไบนารี SHA-384 และ SHA-512 เหมาะสำหรับข้อความที่มีความยาวไม่เกิน 2^128 บิตไบนารี
3.2 หลักการ
SHA-1 เป็นอัลกอริทึมการเข้ารหัสข้อมูล แนวคิดของอัลกอริทึมนี้คือการรับข้อความธรรมดาแล้วแปลงเป็นข้อความรหัส (โดยปกติเล็กกว่า) ในวิธีที่กลับไม่ได้ นอกจากนี้ยังสามารถเข้าใจได้อย่างง่ายดายว่าเป็นกระบวนการของการใช้สตริงของรหัสอินพุต (เรียกว่า premapping หรือข้อมูล) และแปลงเป็นลำดับความยาวที่สั้นกว่าและเป็นตัวเลขหลักคงที่คือค่าแฮช (หรือที่เรียกว่าข้อมูลการย่อยข้อมูลหรือรหัสการตรวจสอบข้อมูล)
ความปลอดภัยของฟังก์ชั่นแฮชทางเดียวอยู่ในลักษณะทางเดียวที่แข็งแกร่งของกระบวนการทำงานของการสร้างค่าแฮช หากรหัสผ่านถูกฝังอยู่ในลำดับอินพุตจะไม่มีใครสามารถสร้างค่าแฮชที่ถูกต้องโดยไม่ทราบรหัสผ่านดังนั้นจึงมั่นใจได้ถึงความปลอดภัย SHA บล็อกสตรีมอินพุตใน 512 บิต (64 ไบต์) ต่อบล็อกและผลิตเอาต์พุต 20 ไบต์ที่เรียกว่ารหัสการรับรองความถูกต้องของข้อมูลหรือข้อมูลย่อย
ความยาวของแพ็คเก็ตอินพุตของอัลกอริทึมนี้ไม่ จำกัด และเอาต์พุตที่สร้างขึ้นคือการย่อยข้อความ 160 บิต อินพุตถูกประมวลผลในแพ็คเก็ต 512 บิต SHA-1 ไม่สามารถย้อนกลับได้ป้องกันความขัดแย้งและมีผลหิมะถล่มที่ดี
ลายเซ็นดิจิตอลสามารถนำไปใช้ผ่านอัลกอริทึมแฮช หลักการของลายเซ็นดิจิตอลคือการแปลงข้อความธรรมดาที่จะส่งไปยังการย่อยข้อความผ่านการดำเนินการฟังก์ชั่น (แฮช) (ข้อความธรรมดาที่แตกต่างกันสอดคล้องกับการย่อยข้อความที่แตกต่างกัน) ข้อความย่อยถูกเข้ารหัสและส่งไปยังผู้รับพร้อมกับข้อความธรรมดา ผู้รับสร้างข้อความใหม่ที่ย่อยเพื่อถอดรหัสและเปรียบเทียบการย่อยข้อความของผู้ส่ง ผลการเปรียบเทียบนั้นสอดคล้องกันซึ่งหมายความว่าข้อความธรรมดาไม่ได้เปลี่ยนแปลง หากไม่สอดคล้องกันก็หมายความว่าข้อความธรรมดาได้รับการดัดแปลงด้วย
Mac (รหัสการตรวจสอบข้อมูลข้อมูล) เป็นผลลัพธ์แฮชซึ่งส่วนหนึ่งของข้อมูลอินพุตเป็นรหัสผ่าน เฉพาะผู้เข้าร่วมที่รู้ว่ารหัสผ่านนี้สามารถคำนวณและตรวจสอบความถูกต้องตามกฎหมายของรหัส MAC อีกครั้ง
3.3 การใช้งาน SHA ใน Java
การใช้งาน Java ของ SHA นั้นคล้ายกับ MD5 และรหัสอ้างอิงมีดังนี้:
แพ็คเกจ amigo.endecrypt; นำเข้า java.security.messagedigest;/*** ใช้การเข้ารหัส shaa* @author xingxing, xie* @datetime 2014-6-1*/คลาสสาธารณะ shautil {/*** shaencode (string instr) โยนข้อยกเว้น {messageGeSest sha = null; ลอง {sha = messageGeSt.getInstance ("sha"); } catch (exception e) {system.out.println (e.toString ()); E.PrintStackTrace (); กลับ ""; } byte [] byteArray = instr.getBytes ("UTF-8"); ไบต์ [] md5bytes = sha.digest (bytearray); StringBuffer hexValue = new StringBuffer (); สำหรับ (int i = 0; i <md5bytes.length; i ++) {int val = ((int) md5bytes [i]) & 0xff; ถ้า (val <16) {hexvalue.append ("0"); } hexvalue.append (integer.tohexstring (val)); } return hexvalue.toString (); } / ** * ทดสอบฟังก์ชั่นหลัก * @param args * @throws exception * / โมฆะคงที่สาธารณะหลัก (สตริง args []) โยนข้อยกเว้น {string str = สตริงใหม่ ("amigoxiexiexingxingxing"); System.out.println ("Original:" + Str); System.out.println ("sha:" + shaencode (str)); -ผลการทดสอบมีดังนี้:
ต้นฉบับ: amigoxiexiexingxing
หลังจาก sha: 04f79f496dd6bdab3439511606528a4ad9caac5e
3. การเปรียบเทียบระหว่าง SHA-1 และ MD5
เนื่องจากทั้งคู่ได้มาจาก MD4, SHA-1 และ MD5 นั้นคล้ายกันมาก ตามลำดับความแข็งแกร่งและลักษณะอื่น ๆ ของพวกเขามีความคล้ายคลึงกัน แต่ก็มีความแตกต่างในประเด็นต่อไปนี้:
1) การรักษาความปลอดภัยต่อการโจมตีที่ถูกบังคับ: ความแตกต่างที่สำคัญและสำคัญที่สุดคือการย่อย SHA-1 นั้นยาวกว่า MD5 Digest 32 บิต การใช้เทคโนโลยีที่ถูกบังคับความยากลำบากในการสร้างข้อความใด ๆ เพื่อให้การย่อยเท่ากับการย่อยที่กำหนดคือการดำเนินการตามลำดับ 2^128 สำหรับ MD5 และการดำเนินการ 2^160 สำหรับ SHA-1 ด้วยวิธีนี้ SHA-1 มีความแข็งแกร่งมากขึ้นสำหรับการโจมตีโดยใช้กำลัง
2) ความปลอดภัยของการวิเคราะห์รหัสผ่าน: เนื่องจากการออกแบบ MD5 จึงมีความเสี่ยงต่อการวิเคราะห์รหัสผ่านและ SHA-1 ดูเหมือนจะมีความอ่อนไหวต่อการโจมตีดังกล่าวน้อยลง
3) ความเร็ว: บนฮาร์ดแวร์เดียวกัน SHA-1 ทำงานช้ากว่า MD5
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น