Generator Hash dan HMAC
- MD5tidak aman
- SHA-1tidak aman
- SHA-256
- SHA-512
MD5 dan SHA-1 sudah rusak dan tidak boleh dipakai untuk kata sandi atau tanda tangan. Keduanya masih layak untuk checksum dan kunci cache.
Apa pun yang Anda masukkan di sini tidak disimpan, dicatat, atau dibagikan.
Ketik atau tempel teks untuk melihat hash MD5, SHA-1, SHA-256, dan SHA-512 sekaligus, atau beralih ke HMAC untuk menandatanganinya dengan kunci rahasia. Semuanya berjalan di peramban Anda, jadi teks maupun kunci tidak keluar dari perangkat.
Cara memakai
- Tempel teks Anda ke kolom masukan.
- Keempat hash dihitung sambil Anda mengetik.
- Salin hash mana pun dengan tombol di sebelahnya.
Apa yang dijamin oleh hash
Hash kriptografis memetakan masukan sepanjang apa pun ke digest berukuran tetap secara deterministik: byte yang sama selalu menghasilkan hasil yang sama, dan mengubah satu bit mengubah kira-kira separuh output. Ada tiga sifat yang membuatnya berguna, dan kegunaan yang berbeda memerlukan sifat yang berbeda.
Ketahanan preimage berarti jika diberi sebuah digest, Anda tidak bisa menemukan masukan yang menghasilkannya. Ketahanan second-preimage berarti jika diberi satu masukan, Anda tidak bisa menemukan masukan lain dengan digest yang sama. Ketahanan collision berarti Anda tidak bisa menemukan dua masukan apa pun yang bertabrakan, dan inilah sifat yang paling mudah diserang dari ketiganya, karena penyerang bebas memilih kedua sisinya.
Perbedaan terakhir itulah yang membuat algoritma yang sudah dibobol tidak sama rusaknya untuk semua keperluan. Collision MD5 bisa dibuat dalam hitungan detik, tetapi tidak ada yang bisa membalik digest MD5, jadi MD5 sebagai kunci cache atau checksum non-adversarial masih boleh, sedangkan MD5 sebagai tanda tangan tidak.
Kondisi setiap algoritma
MD5 sudah dianggap rusak sejak 2004, dan chosen-prefix collision - saat penyerang membuat dua dokumen yang isinya berbeda tetapi hash-nya sama - kini murah dilakukan. MD5 pernah dipakai untuk memalsukan certificate authority yang berfungsi pada 2008 dan oleh malware Flame pada 2012. Pakai untuk checksum, ETag, dan kunci cache; jangan pernah untuk hal yang bisa menguntungkan penyerang jika dibobol.
SHA-1 menyusul. Collision praktis pertama didemonstrasikan pada 2017 dengan dua file PDF, dan chosen-prefix collision berhasil pada 2020 dengan biaya puluhan ribu dolar. Browser sudah bertahun-tahun berhenti menerima sertifikat SHA-1, dan Git sedang bermigrasi meninggalkannya. Anggap saja SHA-1 sebagai MD5 yang umurnya sedikit lebih panjang.
SHA-256 dan SHA-512 adalah pilihan bawaan saat ini dan tidak memiliki kelemahan praktis yang diketahui. Keduanya termasuk keluarga SHA-2; SHA-512 sering lebih cepat di perangkat keras 64-bit meskipun outputnya lebih panjang. SHA-3 ada sebagai cadangan dengan struktur berbeda, bukan pengganti, dan BLAKE3 layak diketahui ketika kecepatan pada file besar penting.
HMAC, dan mengapa tidak cukup meng-hash kunci bersama pesan
Hash biasa tidak membuktikan siapa yang membuatnya, karena siapa pun bisa menghitungnya. HMAC menambahkan kunci rahasia, sehingga digest yang cocok menunjukkan pengirim mengetahui kuncinya dan pesan tidak diubah. Inilah yang menandatangani pengiriman webhook dari Stripe, GitHub, dan layanan lain, serta yang mengautentikasi request API AWS.
Konstruksi yang terasa intuitif - meng-hash kunci diikuti pesan - tidak aman untuk keluarga SHA-2, karena fungsi-fungsi itu berstruktur Merkle-Damgård dan digest-nya adalah seluruh state internalnya. Penyerang yang memiliki satu digest valid bisa melanjutkan dari state tersebut dan menambahkan data, menghasilkan digest valid untuk pesan yang lebih panjang tanpa pernah mengetahui kuncinya. Struktur bersarang HMAC, yang meng-hash dua kali dengan dua kunci turunan, mencegah hal ini.
Satu hal yang harus benar saat verifikasi: bandingkan digest dalam waktu konstan. Perbandingan string biasa langsung berhenti begitu menemukan perbedaan, dan selisih waktunya bisa diukur setelah cukup banyak request, sehingga penyerang bisa memulihkan tanda tangan byte demi byte. Sebagian besar bahasa pemrograman menyediakan fungsi khusus untuk ini.
Hash bukan enkripsi, dan bukan cara menyimpan kata sandi
Hash bersifat satu arah dan tidak memakai kunci: tidak ada yang bisa didekripsi dan tidak ada cara memulihkan masukannya. Jika Anda perlu mendapatkan datanya kembali, yang Anda perlukan adalah enkripsi, alat yang sama sekali berbeda.
Untuk kata sandi, hash yang cepat justru pilihan yang salah. Kecepatan adalah keuntungan penyerang: perangkat keras biasa bisa mencoba miliaran tebakan SHA-256 per detik terhadap database yang dicuri, dan digest tanpa salt bisa langsung dicari di tabel yang sudah dihitung sebelumnya. Penyimpanan kata sandi memerlukan fungsi yang sengaja dibuat lambat dan boros memori, dengan salt untuk setiap kata sandi - bcrypt, scrypt, atau Argon2id, yang saat ini direkomendasikan.
Ada penyalahgunaan yang lebih halus yang perlu disebut: meng-hash identifier untuk menganonimkannya. Meng-hash alamat email atau nomor telepon tidak melindungi apa pun, karena ruang kemungkinan masukannya cukup kecil untuk dicoba satu per satu. Siapa pun yang memegang digest bisa meng-hash semua alamat yang dimilikinya lalu mencocokkannya. Hash dari nilai berentropi rendah hanyalah kunci pencarian, bukan anonimisasi.
Memverifikasi berkas unduhan, langkah demi langkah
Checksum yang dipublikasikan hanya menjawab satu pertanyaan: apakah byte yang saya terima sama dengan byte yang ada di tangan penerbitnya. Hitung hash berkas itu di komputer Anda - shasum -a 256 file.iso di macOS, sha256sum di Linux, Get-FileHash di PowerShell - lalu bandingkan digest-nya dengan yang tertera di halaman unduhan. Beda satu karakter saja berarti berkasnya bukan berkas yang sama.
Yang tidak dijawab perbandingan itu adalah apakah halaman penerbitnya asli. Kalau penyerang bisa mengganti berkas unduhan, biasanya ia juga bisa mengganti checksum di sebelahnya; itulah sebabnya proyek yang serius menandatangani berkas checksum dengan kunci GPG, bukan sekadar memasang digest-nya. Memverifikasi tanda tangannya dulu, baru checksum-nya, barulah rantai yang benar-benar membuktikan sesuatu.
Ini juga alasan MD5 masih boleh dipakai sebagai checksum di situasi tanpa lawan, tetapi tidak boleh dipakai untuk tanda tangan. Untuk menangkap unduhan yang rusak, MD5 sudah cukup; menghadapi orang yang ingin dua berkas punya digest yang sama, ia sudah jebol sejak 2004.
Hash sebagai alamat, bukan sekadar pemeriksa
Sebagian besar infrastruktur modern mengenali konten lewat hash-nya, bukan lewat nama. Git menamai setiap objek dengan digest isinya, dan itulah sebabnya identitas sebuah commit stabil, memperlihatkan jejak jika diutak-atik, dan tidak bergantung pada di mana repositorinya berada. Digest image kontainer bekerja dengan cara yang sama, begitu pula berkas lock paket, yang mengunci sebuah dependensi ke byte yang persis, bukan ke nomor versi yang bisa diterbitkan ulang orang lain.
Deduplikasi memakai gagasan yang sama: sistem backup yang menghitung hash tiap blok menyimpan blok identik cukup sekali, dan sebuah content delivery network bisa melakukan cache berdasarkan digest tanpa risiko menyajikan data basi, karena konten yang berbeda punya alamat yang berbeda.
Merkle tree memperluasnya. Menghitung hash dari pasangan hash ke atas menghasilkan satu digest akar yang mengikat seluruh kumpulan data, dan itulah yang memungkinkan klien memastikan satu item memang ada di dalamnya tanpa mengunduh semuanya. Log certificate transparency, blockchain, dan beberapa basis data tereplikasi semuanya bersandar pada struktur itu.
Memverifikasi tanda tangan webhook dengan benar
Polanya sama di Stripe, GitHub, Slack, dan hampir semua layanan lain. Pengirim menghitung HMAC dari body permintaan yang masih mentah memakai secret bersama lalu menaruh digest-nya di sebuah header; penerima menghitung ulang dan membandingkannya. Ada empat detail yang menentukan apakah implementasinya benar-benar kokoh.
Pertama, hash body yang mentah, bukan hasil serialisasi ulang dari JSON yang sudah di-parse - urutan kunci dan spasi mengubah byte-nya, dan karenanya mengubah digest-nya. Kedua, bandingkan dalam waktu konstan, karena perbandingan string biasa membocorkan di mana letak perbedaan pertama, dan dengan permintaan yang cukup banyak selisih waktu itu berubah menjadi tanda tangannya. Ketiga, sertakan timestamp yang dikirim pengirim ke dalam payload yang ditandatangani dan tolak apa pun yang lebih tua dari beberapa menit, kalau tidak, permintaan yang berhasil disadap bisa diputar ulang tanpa batas.
Keempat, dukung dua secret sekaligus. Rotasi kunci mustahil kalau penerima hanya tahu satu, dan cara yang lazim adalah menerima keduanya selama jendela tumpang tindih yang singkat.
Memilih parameter untuk hashing kata sandi
Argon2id adalah rekomendasi saat ini, dan tidak seperti hash biasa, ia menerima parameter: memori, iterasi, dan paralelisme. Biaya memorilah yang mematahkan perangkat keras khusus, sebab GPU dan ASIC punya daya hitung jauh lebih besar dibandingkan memori cepat yang tersedia per intinya. Titik awal yang umum adalah 19 MiB dengan dua iterasi, dan lebih tinggi lagi bila perangkat kerasnya memungkinkan.
Cara menyetelnya adalah dengan mengukur. Ukur di mesin yang nanti benar-benar menjalankannya, lalu pilih biaya tertinggi yang masih menjaga satu proses login di bawah sekitar seperempat detik, sambil mengingat bahwa lonjakan login akan mengalikan biaya itu ke setiap permintaan yang berbarengan. bcrypt dengan work factor 12 masih bisa diterima dan lebih mudah diterapkan di sebagian stack; scrypt berada di antara keduanya.
Migrasi tidak memerlukan kata sandi siapa pun. Simpan algoritme dan parameternya berdampingan dengan tiap digest, verifikasi sesuai isi catatan yang tersimpan, lalu hitung ulang hash-nya dengan setelan baru tepat pada saat login berhasil. Dalam beberapa bulan, sebagian besar akun aktif akan berpindah dengan sendirinya.
Ketika hash adalah alat yang keliru
Meng-hash sebuah identitas untuk menganonimkannya tidak berhasil, dan alasannya layak dipahami alih-alih dihafal. Hash bersifat deterministik dan ruang masukannya kecil: jumlah alamat email dan nomor telepon itu terbatas, sehingga siapa pun yang memegang digest-nya bisa meng-hash setiap kandidat yang ia miliki lalu mencocokkannya. Beberapa skema periklanan dan analitik yang dipasarkan sebagai penjaga privasi berdiri persis di atas kekeliruan ini.
Kalau Anda memang perlu membandingkan identitas tanpa mengungkapkannya, primitif yang dipakai berbeda - keyed hash dengan secret yang tidak dipegang siapa pun selain Anda, atau protokol yang dirancang untuk private set intersection.
Ada dua salah pakai lain yang sering muncul. Hash bukan algoritme kompresi, sebab tidak ada apa pun yang bisa dipulihkan darinya. Dan hash non-kriptografis seperti CRC32 atau MurmurHash sangat bagus untuk tabel hash dan checksum, tetapi tidak berguna ketika masukannya dipilih oleh lawan, karena tabrakan bisa dibuat dengan sengaja untuk menurunkan sebuah struktur data menjadi penelusuran linear.
Pertanyaan umum
- Apa itu HMAC dan kapan saya membutuhkannya?
- HMAC memadukan hash dengan kunci rahasia untuk membuktikan bahwa sebuah pesan berasal dari pemegang kunci itu dan tidak diubah. Hash biasa tidak membuktikan keduanya, karena siapa pun bisa menghitungnya ulang. HMAC-lah yang menandatangani payload webhook dan permintaan API. Beralihlah ke mode HMAC dan masukkan kuncinya.
- Apakah MD5 aman dipakai?
- Tidak untuk keamanan. MD5 punya serangan tabrakan yang praktis dan tidak boleh dipakai untuk kata sandi, tanda tangan, atau integritas menghadapi penyerang sungguhan. MD5 masih wajar untuk keperluan non-adversarial seperti checksum, kunci cache, dan ETag, dan karena itulah ia disertakan di sini.
- Kalau begitu bagaimana cara meng-hash kata sandi?
- Bukan dengan salah satu dari ini. Penyimpanan kata sandi memerlukan algoritme lambat bergaram yang memang dirancang untuk itu, seperti bcrypt, scrypt, atau Argon2. Hash serbaguna yang cepat seperti SHA-256 bisa dibobol dengan miliaran tebakan per detik.
- Apakah masukan saya dikirim ke server?
- Tidak. Hash SHA memakai Web Crypto API peramban dan MD5 diimplementasikan dengan JavaScript di halaman ini, jadi teks Anda tidak pernah keluar dari perangkat.
- Kenapa MD5 tidak ada di Web Crypto API peramban?
- MD5 sengaja ditinggalkan karena sudah rusak secara kriptografis, jadi di sini ia diimplementasikan terpisah. Implementasinya diverifikasi terhadap vektor uji resmi RFC 1321.
- Apakah ini menangani teks non-Latin?
- Ya. Masukan dikodekan sebagai UTF-8 sebelum di-hash, jadi bahasa Jepang, Tionghoa, Korea, dan emoji menghasilkan hash yang sama persis dengan alat baris perintah standar mana pun.
Terakhir diperbarui:
Sertakan langkah, hasil yang diharapkan, dan hasil sebenarnya. Hapus rahasia dan data pribadi.
