เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ · SHA เครื่องคำนวณแฮช
Hex, Base64 และ Raw Bytes: สามวิธีในการเขียน SHA Digest แบบเดียวกัน
· มันทำงานอย่างไร
sha-256 base64 การเข้ารหัส ไฟล์รูปแบบ
sha256sum พิมพ์เลขฐานสิบหก, package-lock.json เก็บ base64 และ Docker ใช้ sha256: คำนำหน้า ทั้งหมดสามารถเหมือนกันได้ 32 bytes โพสต์นี้จะอธิบายการนำเสนอแต่ละรายการและวิธีแปลงระหว่างการนำเสนอเหล่านั้น
แฮชที่ดูแตกต่างแต่เห็นด้วย — สตริงไฟล์ล็อคและการตรวจสอบเทอร์มินัลสำหรับไฟล์เดียวกัน
การแยกย่อย SHA-256 โดยพื้นฐานแล้วคือ 32 bytes วิธีที่คุณเขียนไบต์เหล่านั้นจะเป็นตัวกำหนดว่าไดเจสต์จะเป็นอย่างไร การแยกย่อย 32 ไบต์ที่เหมือนกัน ปรากฏเป็นอักขระฐานสิบหก 64 (สองตัวต่อไบต์) หรือ 44 อักขระฐาน 64 (ประมาณสี่ต่อสามไบต์) หรือความยาวและรูปแบบที่แตกต่างกัน ขึ้นอยู่กับการเข้ารหัส ความสับสนเกิดขึ้นเนื่องจากไฟล์ล็อคอาจแสดงการแสดงหนึ่งรายการและเทอร์มินัลแสดงอีกรายการหนึ่ง ทั้งคู่สำหรับ 32 bytes พื้นฐานเดียวกัน
การทำความเข้าใจการเข้ารหัสเป็นขั้นตอนที่เปลี่ยน "เหตุใดสิ่งเหล่านี้จึงดูแตกต่าง" เป็น "ฉันยืนยันได้เลยว่าพวกเขาเหมือนกัน" การเป็นตัวแทนทั้งสามนั้นเทียบเท่ากันเมื่อคุณถอดรหัสกลับเป็นไบต์
การสรุปข้อมูลคือไบต์ — 20, 32, 48 หรือ 64 ขึ้นอยู่กับอัลกอริทึม ก่อนที่จะเข้ารหัสข้อความใดๆ
ก่อนที่จะมีการแสดงข้อความใดๆ ผลลัพธ์จะเป็น ArrayBuffer ของไบต์ย่อย ToolAcre ล้อมบัฟเฟอร์นั้นด้วย Uint8Array จากนั้นเขียนแต่ละไบต์เป็นเลขฐานสิบหกสองหลักหรือแปลงแต่ละไบต์เป็นอักขระไบนารี่ก่อนที่จะเรียก btoa ตัวจัดรูปแบบจะไม่รันแฮชซ้ำ และไม่มีการเปลี่ยนแปลงบิตย่อยแม้แต่บิตเดียว
ความกว้างของไบต์เป็นไปตามอัลกอริทึมที่เลือกในเครื่องมือนี้: SHA-1 ส่งคืนยี่สิบไบต์, SHA-256 สามสิบสอง, SHA-384 สี่สิบแปด และ SHA-512 หกสิบสี่ สิ่งเหล่านี้เป็นเอาต์พุตที่รองรับซึ่งตรวจสอบโดยข้อมูลเมตาของอัลกอริทึมและการทดสอบ ไบต์ดิบมีความเหมาะสมสำหรับการเปรียบเทียบทางโปรแกรม hex และ base64 เป็นสัญลักษณ์การขนส่งสำหรับช่องที่คาดหวังข้อความ
เลขฐานสิบหก — อักขระสองตัวต่อไบต์ เหตุใดจึงครอบงำเครื่องมือบรรทัดคำสั่ง และคำถามเกี่ยวกับกรณี
การแสดงเลขฐานสิบหกใช้ตัวเลข 0-9 และตัวอักษร A-F (หรือ a-f) เพื่อแสดง 16 ค่าที่เป็นไปได้ของ 4-bit nibble เลขฐานสิบหกสองหลักแทนหนึ่งไบต์ สรุป SHA-256 ของอินพุต abc คือ 32 bytes ดังนั้นจึงแสดงเป็นอักขระฐานสิบหก 64: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad นี่คือรูปแบบที่เครื่องมือบรรทัดคำสั่งส่วนใหญ่พิมพ์ เลขฐานสิบหกเป็นตัวเลขที่มนุษย์สามารถอ่านได้และไม่คลุมเครือ ทุกไบต์จะแสดงด้วยอักขระสองตัวที่เหมือนกันทุกครั้ง
เลขฐานสิบหกเป็นรูปแบบเริ่มต้นสำหรับเช็คซัมและแฮชในเอกสารประกอบและในบรรทัดคำสั่ง อ่านและคัดลอกได้ง่าย และไม่มีช่องว่างภายใน ไม่มีความละเอียดอ่อนของตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ในการตีความ (แม้ว่าแบบแผนจะกำหนดตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่อย่างสม่ำเสมอ) และไม่มีอักขระพิเศษที่ต้อง Escape ใน URL หรือ JSON ข้อเสียคือต้องใช้อักขระมากกว่าไบต์ดิบถึงสองเท่า ซึ่งเป็นสาเหตุว่าทำไมจึงมีรูปแบบอื่นอยู่
Base64 และ base64url — ประมาณสี่อักขระต่อสามไบต์ การเติม และตำแหน่งที่แต่ละตัวปรากฏ (SRI, npm, SSH ลายนิ้วมือ)
Base64 เข้ารหัสสามไบต์เป็นอักขระสี่ตัวที่ดึงมาจากตัวอักษร 64: A-Z, a-z, 0-9, +, /. สามไบต์ 61 62 63 (ASCII รหัสสำหรับ abc) เข้ารหัสเป็น YWJj ใน base64 32-ไบต์ SHA-256 แบบเต็มจะเข้ารหัสเป็นอักขระฐาน 64 ประมาณ 44 การเติมด้วยอักขระ = จะทำให้ความยาวเอาต์พุตเป็นทวีคูณของ 4 ดังนั้น อักขระ 44 บวกกับการขยาย 0 (เนื่องจาก 32 เป็นผลคูณของ 3 จึงไม่จำเป็นต้องเติมช่องว่าง) การถอดรหัสจะทำให้กระบวนการย้อนกลับ: อักขระ base64 สี่ตัวถอดรหัสเป็นสามไบต์
Base64 ปรากฏในไฟล์ package-lock.json, การย่อขนาด npm, แอตทริบิวต์ SRI (ความสมบูรณ์ของทรัพยากรย่อย) ใน HTML และลายนิ้วมือของคีย์ SSH มีขนาดกะทัดรัด — ยาวกว่าไบต์ดิบประมาณ 33% เทียบกับ 100% ของเลขฐานสิบหกที่ยาวกว่า ข้อเสียคือการแสดงข้อความบางรายการไม่สามารถอ่านได้ง่ายเท่ากัน base64 ดูมีสัญญาณรบกวนสายตามนุษย์มากกว่าเลขฐานสิบหก
รูปแบบคำนำหน้า — sha256: ในคอนเทนเนอร์ไดเจสต์, sha384- ในแอตทริบิวต์ความสมบูรณ์, SHA256: ใน SSH
Base64url เป็นตัวแปรที่กำหนดใน RFC 4648 ซึ่งใช้แทน - และ _ สำหรับ + และ /. ตัวอักษรจะกลายเป็น A-Z, a-z, 0-9, -, _ JWT ใช้ base64url เนื่องจาก + และ / มีความหมายพิเศษใน URL (+ สามารถอ่านเป็นช่องว่างในสตริงการสืบค้น / เป็นตัวคั่นเส้นทาง) เซ็กเมนต์ JWT จะถูกเข้ารหัส base64url เสมอ และตัวถอดรหัสที่ยืนยันใน base64 มาตรฐานจะปฏิเสธ ในทางกลับกัน ตัวถอดรหัส base64url ที่ไม่ยอมรับตัวอักษรมาตรฐานจะใช้งานไม่ได้บน base64 มาตรฐาน
การเสริมเป็นทางเลือกใน base64url แผ่นฐาน base64 มาตรฐานที่มี = เพื่อให้แน่ใจว่าความยาวเอาต์พุตเป็นผลคูณของ 4 โดยทั่วไป Base64url จะละเว้นช่องว่างภายในเนื่องจาก = เป็นตัวของตัวเอง URL-น่าอึดอัดใจ ตัวถอดรหัสควรยอมรับ base64url โดยมีหรือไม่มีช่องว่างภายใน และตัวเข้ารหัสควรมีความชัดเจนเกี่ยวกับสิ่งที่สร้างขึ้น เครื่องมือ ToolAcre base64 ยอมรับทั้งตัวอักษรและทนต่อช่องว่างภายในที่ขาดหายไปในอินพุต และให้คุณเลือกรูปแบบของเอาต์พุตได้
ตัวอย่างการทำงาน — หนึ่งไดเจสต์ถูกแปลงจาก hex เป็น base64 และย้อนกลับ โดยมีการทำเครื่องหมายขอบเขตไบต์
แบบฟอร์มนำหน้าจะเพิ่มตัวระบุโครงร่างให้กับไดเจสต์ การสรุปอิมเมจนักเทียบท่าใช้ sha256:ba7816bf... โดยที่ sha256: เป็นคำนำหน้า SSH ลายนิ้วมือใช้ SHA256: โดยมีเครื่องหมายโคลอน เครื่องมือบางอย่างใช้ sha256= หรือ SHA256= (โดยมีเครื่องหมายเท่ากับ) คำนำหน้าเป็นเพียงข้อมูลเท่านั้น มันจะบอกคุณว่าอัลกอริธึมใดที่ทำให้เกิดการย่อย การลบคำนำหน้าจะทำให้มีไบต์เดียวกันในการเข้ารหัสเดียวกัน
เมื่อเปรียบเทียบไดเจสต์ คำนำหน้าคือสัญญาณรบกวน หากเครื่องมือหนึ่งพิมพ์ SHA256:ba78... และอีกเครื่องมือหนึ่งพิมพ์ ba78... เครื่องมือเหล่านั้นจะเป็นข้อมูลย่อยเดียวกัน คำนำหน้าเป็นเพียงข้อมูลเมตาเกี่ยวกับรูปแบบ ในทำนองเดียวกัน คำนำหน้าเช่น sha256:- (ใช้ในบริบทของคอนเทนเนอร์บางอย่าง) หรือ sha384- (ใช้ในแอตทริบิวต์ความสมบูรณ์) เป็นรูปแบบการจัดรูปแบบที่ไม่เปลี่ยนไบต์ ลอกออกเพื่อเปรียบเทียบ
สิ่งนี้ไม่ครอบคลุมถึงการเข้ารหัสที่เครื่องมือกำหนดส่งออกมา ตรวจสอบรูปแบบผลลัพธ์ก่อนที่จะเปรียบเทียบ
การแยกย่อยอย่างหนึ่งคือ SHA-256 ของอินพุต abc ปรากฏในหลายรูปแบบ: อักขระฐานสิบหก (64 อักขระ), base64 พร้อมช่องว่างภายใน (44 อักขระ), base64url พร้อมช่องว่างภายใน (44 อักขระ โดยมี - และ _ แทน + และ /), หรือมีคำนำหน้าต่างๆ เพื่อยืนยันว่าเหมือนกัน ให้ถอดรหัสกลับแต่ละรายการเป็นไบต์ และเปรียบเทียบไบต์ การแทนค่าฐานสิบหก ba7816bf... ถอดรหัสเป็นไบต์ 0xba 0x78 0x16 0xbf 0x8f 0x01 0xcf 0xea ... การแทนค่า base64 จะแปลงเป็นลำดับไบต์เดียวกันเมื่อถอดรหัส
เครื่องคำนวณแฮช ToolAcre SHA ส่งออกเป็นเลขฐานสิบหกตามค่าเริ่มต้น หากคุณต้องการ base64 คุณสามารถใช้เครื่องมือแยกต่างหากเพื่อแปลงเลขฐานสิบหกเป็น base64 หรือใช้ยูทิลิตี้ base64 บนไซต์เดียวกันเพื่อเข้ารหัสข้อความโดยตรง เครื่องมือที่ออกแบบมาสำหรับบริบทเฉพาะ (npm สำหรับ package-lock.json, Docker สำหรับการย่อยรูปภาพ) เอาต์พุตในรูปแบบที่บริบทคาดหวัง การทำความเข้าใจว่าสิ่งเหล่านี้ 32 bytes เหมือนกันโดยแต่งต่างกัน จะช่วยขจัดความสับสนเมื่อเครื่องมือไม่เห็นด้วยกับรูปแบบ
Takeaway: เปรียบเทียบไบต์ ไม่ใช่สตริง — คำนวณการแยกย่อยด้วยเครื่องคำนวณแฮช ToolAcre SHA จากนั้นแปลงเป็นตัวแทนที่คุณกำลังตรวจสอบด้วย
หากต้องการแปลงการแยกย่อยฐานสิบหกเป็น base64 ด้วยตนเอง ให้จัดกลุ่มเลขฐานสิบหกเป็นไบต์ แล้วแปลงแต่ละไบต์เป็นทศนิยม จากนั้นเข้ารหัสโดยใช้ตัวอักษร base64 ไบต์ 0xba (hex ba) เป็นทศนิยม 186; 0x78 คือ 120; 0x16 คือ 22; 0xbf คือ 191 การจัดกลุ่มสี่ไบต์เหล่านี้และการเข้ารหัสเป็น base64 จะให้อักขระ w (0 + 22 ในตัวอักษร), as (การเข้ารหัส 186), AA (การเข้ารหัส 120), vw (การเข้ารหัส 191) การสรุปข้อมูลทั้งหมดจำเป็นต้องทำ 10 ครั้งและเติมช่องว่างหากจำเป็น กระบวนการที่ต้องดำเนินการด้วยตนเองนี้ให้ความรู้แต่น่าเบื่อ เครื่องมือแปลง base64 ทำให้ใช้งานได้ทันที
ข้อมูลเชิงลึกที่สำคัญคือการแยกย่อยจะคำนึงถึงไบต์ก่อน และการแสดงข้อความถือเป็นเรื่องรอง การเข้ารหัสไบต์เดียวกันทุกครั้งจะถอดรหัสกลับไปเป็นไบต์เดียวกัน ดังนั้นจึงสามารถใช้แทนกันได้เพื่อวัตถุประสงค์ในการตรวจสอบความสมบูรณ์ ความแตกต่างของตัวพิมพ์ในฐานสิบหก ความแตกต่างของการเติมใน base64 คำนำหน้า และการเว้นวรรค ล้วนเป็นตัวเลือกการจัดรูปแบบที่ไม่ส่งผลต่อค่าจริง เมื่อคุณเชี่ยวชาญความสามารถในการแปลงระหว่างการนำเสนอ รูปแบบย่อยที่ไม่ตรงกันจะกลายเป็นปัญหาการดีบักที่คุณสามารถแก้ไขได้แทนที่จะกลายเป็นเรื่องลึกลับ