Message Digest (hash) is byte [] in byte [] out
ข้อความสรุปถูกกำหนดให้เป็นฟังก์ชั่นที่รับอาร์เรย์ไบต์ดิบและส่งกลับอาร์เรย์ไบต์ดิบ (aka byte[]
) ตัวอย่างเช่นSHA-1 (Secure Hash Algorithm 1)มีขนาดย่อย 160 บิตหรือ 20 ไบต์ อาร์เรย์ไบต์แบบ Raw มักไม่สามารถตีความได้ว่าเป็นการเข้ารหัสอักขระเช่นUTF-8เพราะไม่ใช่ทุกไบต์ในทุกคำสั่งเป็นกฎหมายที่เข้ารหัส ดังนั้นการแปลงให้เป็นString
:
new String(md.digest(subject), StandardCharsets.UTF_8)
อาจสร้างลำดับที่ผิดกฎหมายบางอย่างหรือมีตัวชี้รหัสไปยังการแมปUnicode ที่ไม่ได้กำหนด:
[�a�ɹ??�%l�3~��.
การเข้ารหัสแบบไบนารีเป็นข้อความ
สำหรับการเข้ารหัสแบบไบนารีต่อข้อความนั้นใช้ ด้วย hashes หนึ่งที่ถูกนำมาใช้มากที่สุดคือการเข้ารหัส HEX หรือ Base16 โดยทั่วไปไบต์สามารถมีค่าจาก0
ไป255
(หรือ-128
ที่จะ127
ลงนาม) ซึ่งเทียบเท่ากับการเป็นตัวแทนของ HEX -0x00
0xFF
ดังนั้น hex จะเพิ่มความยาวของเอาต์พุตที่ต้องการเป็นสองเท่านั่นหมายความว่าเอาต์พุต 20 ไบต์จะสร้างสตริง hex ยาว 40 อักขระเช่น
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
โปรดทราบว่าไม่จำเป็นต้องใช้การเข้ารหัสฐานสิบหก นอกจากนี้คุณยังสามารถใช้สิ่งที่ต้องการbase64 Hex มักเป็นที่ต้องการเนื่องจากมนุษย์สามารถอ่านได้ง่ายขึ้นและมีความยาวเอาต์พุตที่กำหนดโดยไม่ต้องใช้ช่องว่างภายใน
คุณสามารถแปลงอาร์เรย์ไบต์เป็นฐานสิบหกด้วยฟังก์ชันการทำงาน JDK เพียงอย่างเดียว:
new BigInteger(1, token).toString(16)
อย่างไรก็ตามโปรดทราบว่าBigInteger
จะตีความอาร์เรย์ไบต์ที่กำหนดเป็นตัวเลขและไม่เป็นสตริงไบต์ นั่นหมายความว่าเลขศูนย์นำหน้าจะไม่ถูกเอาต์พุตและสตริงผลลัพธ์อาจสั้นกว่า 40 ตัวอักษร
ใช้ไลบรารีเพื่อเข้ารหัสเป็น HEX
ตอนนี้คุณสามารถคัดลอกและวางวิธีการไบต์ต่อฐานสิบหกยังไม่ทดลองจากกองมากเกินหรือใช้อ้างอิงขนาดใหญ่เหมือนฝรั่ง
หากต้องการมีโซลูชัน go-to สำหรับปัญหาที่เกี่ยวข้องกับไบต์ส่วนใหญ่ฉันได้ติดตั้งยูทิลิตีเพื่อจัดการกับกรณีเหล่านี้: bytes-java (Github)
ในการแปลงอาร์เรย์ย่อยข้อความของคุณคุณสามารถทำได้
String hex = Bytes.wrap(md.digest(subject)).encodeHex();
หรือคุณสามารถใช้คุณสมบัติแฮชในตัว
String hex = Bytes.from(subject).hashSha1().encodeHex();
SHA1
ไม่มีเครื่องหมายขีดคั่นไม่ทราบว่าจะสร้างความแตกต่างหรือไม่