Alat pengembang · SHA kalkulator hash
Hex, Base64 dan Raw Bytes: Tiga Cara Menulis Intisari SHA yang Sama
· Cara kerjanya
sha-256 base64 pengkodean format file
sha256sum mencetak hex, package-lock.json menyimpan base64 dan Docker menggunakan awalan sha256:. Semuanya bisa sama 32 bytes. Posting ini menjelaskan setiap representasi dan cara mengonversinya.
Hash yang terlihat berbeda tetapi setuju — string lockfile dan checksum terminal untuk file yang sama
Intisari SHA-256 pada dasarnya adalah 32 bytes. Cara Anda menulis byte tersebut menentukan seperti apa intisarinya. Satu intisari, 32 byte identik, muncul sebagai 64 karakter heksadesimal (dua per byte), atau 44 karakter base64 (kira-kira empat per tiga byte), atau panjang dan format berbeda bergantung pada pengkodean. Kebingungan muncul karena lockfile mungkin menampilkan satu representasi dan terminal menampilkan representasi lainnya, keduanya untuk 32 bytes dasar yang sama.
Memahami pengkodean adalah langkah yang mengubah "mengapa ini terlihat berbeda?" menjadi "Saya dapat mengonfirmasi bahwa keduanya sama." Ketiga representasi tersebut setara setelah Anda mendekodekannya kembali ke byte.
Intisari adalah byte — 20, 32, 48 atau 64 di antaranya bergantung pada algoritme, sebelum pengkodean teks apa pun
Sebelum representasi tekstual apa pun ada, hasilnya adalah ArrayBuffer byte intisari. ToolAcre membungkus buffer itu dengan Uint8Array, lalu menulis setiap byte sebagai dua digit heksadesimal atau mengonversi setiap byte menjadi karakter biner sebelum memanggil btoa. Tidak ada pemformat yang menjalankan kembali hash, dan tidak ada yang mengubah sedikit pun intisari.
Lebar byte mengikuti algoritma yang dipilih dalam alat ini: SHA-1 mengembalikan dua puluh byte, SHA-256 tiga puluh dua, SHA-384 empat puluh delapan dan SHA-512 enam puluh empat. Itu adalah keluaran yang didukung yang diverifikasi oleh metadata dan pengujian algoritme. Byte mentah sesuai untuk perbandingan terprogram; hex dan base64 adalah notasi transportasi untuk saluran yang mengharapkan teks.
Hex — dua karakter per byte, mengapa ia mendominasi alat baris perintah, dan pertanyaan kasusnya
Representasi heksadesimal menggunakan angka 0-9 dan huruf A-F (atau a-f) untuk mewakili 16 nilai yang mungkin dari camilan 4-bit. Dua digit hex mewakili satu byte. Intisari SHA-256 dari input abc adalah 32 bytes, sehingga ditampilkan sebagai 64 karakter hex: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. Ini adalah format yang paling banyak dicetak oleh alat baris perintah. Heksadesimal dapat dibaca manusia dan tidak ambigu; setiap byte diwakili oleh dua karakter yang sama persis setiap saat.
Heksadesimal adalah format default untuk checksum dan hash dalam dokumentasi dan pada baris perintah. Mudah dibaca dan disalin, dan tidak ada padding, tidak ada sensitivitas huruf besar-kecil dalam penafsiran (walaupun konvensi menentukan huruf kecil atau huruf besar secara konsisten), dan tidak ada karakter khusus yang perlu di-escape dalam URL atau JSON. Kelemahannya adalah dibutuhkan karakter dua kali lebih banyak daripada byte mentah, itulah sebabnya ada format lain.
Base64 dan base64url — kira-kira empat karakter per tiga byte, padding, dan tempat munculnya masing-masing (SRI, npm, SSH sidik jari)
Base64 mengkodekan tiga byte sebagai empat karakter yang diambil dari alfabet karakter 64: A-Z, a-z, 0-9, +, /. Tiga byte 61 62 63 ( ASCII kode untuk abc) dikodekan sebagai YWJj di base64. Intisari 32-byte SHA-256 lengkap dikodekan menjadi sekitar 44 karakter base64. Padding dengan = karakter membuat panjang keluaran menjadi kelipatan 4, jadi 44 karakter ditambah padding 0 (karena 32 adalah kelipatan 3, tidak diperlukan padding). Penguraian kode membalikkan proses: empat karakter base64 didekode menjadi tiga byte.
Base64 muncul di file package-lock.json, npm shrinkwrap, atribut SRI (Integritas Subsumber Daya) di HTML, dan sidik jari kunci SSH. Bentuknya ringkas — kira-kira 33% lebih panjang dibandingkan byte mentah, dibandingkan dengan byte heksadesimal yang 100% lebih panjang. Kekurangannya adalah tidak semua representasi teks mudah dibaca; base64 terlihat lebih acak di mata manusia daripada hex.
Formulir awalan — sha256: dalam ringkasan kontainer, sha384- dalam atribut integritas, SHA256: dalam SSH
Base64url adalah varian yang didefinisikan dalam RFC 4648 yang menggantikan - dan _ untuk + dan /. Alfabet menjadi A-Z, a-z, 0-9, -, _. JWT menggunakan base64url karena + dan / memiliki arti khusus di URL (+ dapat dibaca sebagai spasi dalam string kueri, / adalah pemisah jalur). Segmen JWT selalu dikodekan dengan url base64, dan dekoder yang menggunakan base64 standar akan menolaknya. Sebaliknya, dekoder url base64 yang tidak menerima alfabet standar akan gagal pada base64 standar.
Padding bersifat opsional di base64url. Bantalan base64 standar dengan = untuk memastikan panjang keluaran adalah kelipatan 4. Base64url biasanya menghilangkan padding karena = itu sendiri URL-canggung. Decoder harus menerima base64url dengan atau tanpa padding, dan encoder harus secara eksplisit menjelaskan apa yang dihasilkannya. Alat ToolAcre base64 menerima alfabet dan mentoleransi kekurangan padding pada input, dan memungkinkan Anda memilih format pada output.
Contoh praktis - satu intisari dikonversi dari hex ke base64 dan sebaliknya, dengan batas byte ditandai
Formulir yang diawali menambahkan pengidentifikasi skema ke intisari. Pencernaan gambar Docker menggunakan sha256:ba7816bf..., dengan sha256: sebagai awalannya. SSH sidik jari menggunakan SHA256:, dengan titik dua. Beberapa alat menggunakan sha256= atau SHA256= (dengan tanda sama dengan). Awalannya murni bersifat informasi; ini memberi tahu Anda algoritma mana yang menghasilkan intisari. Menghapus awalan akan meninggalkan byte yang sama dalam pengkodean yang sama.
Saat membandingkan intisari, awalannya adalah kebisingan. Jika satu alat mencetak SHA256:ba78... dan alat lainnya mencetak ba78..., keduanya merupakan intisari yang sama; awalannya hanyalah metadata tentang formatnya. Demikian pula, awalan seperti sha256:- (digunakan dalam beberapa konteks kontainer) atau sha384- (digunakan dalam atribut integritas) adalah konvensi pemformatan yang tidak mengubah byte. Hapus mereka untuk perbandingan.
Apa yang tidak tercakup di sini - pengkodean apa yang dikeluarkan oleh alat tertentu; periksa format keluaran sebelum membandingkan
Satu intisari, SHA-256 dari masukan abc, muncul dalam berbagai bentuk: hex (64 karakter), base64 dengan padding (44 karakter), base64url dengan padding (44 karakter, dengan - dan _ sebagai pengganti + dan /), atau dengan berbagai awalan. Untuk mengonfirmasi bahwa keduanya sama, dekode masing-masing kembali ke byte dan bandingkan byte. Representasi hex ba7816bf... dikodekan ke byte 0xba 0x78 0x16 0xbf 0x8f 0x01 0xcf 0xea ... Representasi base64 diubah menjadi urutan byte yang sama saat didekode.
Output kalkulator hash ToolAcre SHA dalam heksadesimal secara default. Jika Anda memerlukan base64, Anda dapat menggunakan alat terpisah untuk mengonversi hex ke base64, atau menggunakan utilitas base64 di situs yang sama untuk menyandikan teks secara langsung. Alat yang dirancang untuk konteks tertentu (npm untuk package-lock.json, Docker untuk ringkasan gambar) menghasilkan format yang diharapkan oleh konteksnya. Memahami bahwa ini semua adalah 32 bytes yang sama dengan pakaian yang berbeda menghilangkan kebingungan ketika alat tidak setuju dengan formatnya.
Kesimpulan: bandingkan byte, bukan string — hitung intisarinya dengan kalkulator hash ToolAcre SHA, lalu konversikan ke representasi yang Anda periksa
Untuk mengonversi intisari hex ke base64 secara manual, kelompokkan digit hex ke dalam byte, konversi setiap byte ke desimal, lalu enkode menggunakan alfabet base64. Byte 0xba (hex ba) adalah desimal 186; 0x78 adalah 120; 0x16 adalah 22; 0xbf adalah 191. Pengelompokan empat byte ini dan pengkodean sebagai base64 menghasilkan karakter w (0 + 22 dalam alfabet), sebagai (pengkodean 186), AA (pengkodean 120), vw (pengkodean 191). Intisari lengkap memerlukan melakukan ini 10 kali dan menambahkan bantalan jika diperlukan. Proses manual ini bersifat instruktif namun membosankan; alat konverter base64 membuatnya instan.
Wawasan utamanya adalah bahwa intisari adalah byte pertama, dan representasi teks adalah yang kedua. Setiap pengkodean byte yang sama diterjemahkan kembali ke byte yang sama dan dengan demikian dapat dipertukarkan untuk keperluan verifikasi integritas. Perbedaan huruf besar-kecil dalam hex, perbedaan padding dalam base64, awalan, dan spasi adalah pilihan pemformatan yang tidak memengaruhi nilai sebenarnya. Saat Anda menguasai kemampuan untuk mengkonversi antar representasi, ketidakcocokan format intisari menjadi masalah debugging yang dapat Anda pecahkan alih-alih menjadi misteri.