Fungsi Hash
merupakan sebuah algoritma yang mengubah text atau message menjadi sederetan
karakter acak yang memiliki jumlah karakter yang sama. Hash juga termasuk salah
satu bentuk teknik kriptografi dan
dikategorikan sebagai kriptografi tanpa key (unkeyed cryptosystem).
Selain itu hash memiliki nama lain yang juga dikenal luas yaitu “one-way function”.
Kita sering sekali menjumpai hash di website-website yang
menyediakan layanan untuk download file ataupun program secara resmi. Hash
memang umumnya digunakan untuk mengecek integritas dari sebuah pesan atau file.
File atau pesan yang sudah berubah akan memiliki nilai hash yang berbeda.
Sebagai contoh, dengan sebuah algoritma hash, pesan'hello' akan memberikan nilai hash 12345 sedangkan pesan 'hallo' memiliki
nilai hash83746. Dengan kata lain
output hash dari kata 'hello' tidak akan
sama dengan 'hallo'. Bahkan sekalipun
dalam kacamata kita kedua pesan tersebut terlihat hanya memiliki perbedaan
sedikit saja, namun nilai hash yang dimiliki oleh kedua pesan tersebut sangat
jauh berbeda.
Berbeda dengan teknik enkripsi dalam kriptografi, tujuan
hash memang mengubah sebuah pesan yang dapat dibaca (readable text) menjadi
pesan acak (unreadable text) sama seperti enkripsi, namun hal mendasar yang
menjadi perbedaan dari hash adalah pesan yang telah acak tadi tidak dapat diubah
kembali menjadi pesan yang seharusnya. Inilah mengapa hash disebut juga sebagai
“one-way function“.
Ketika pertama kali belajar konsep hash, enkripsi, dan
dekripsi, saya mencoba bersikap kritis dengan mengambil hipotesis bahwa dengan
algoritma yang tepat, hash pasti dapat dibalikkan (reverse). Dengan kata lain
keyakinan saya terhadap dekripsi sebuah fungsi hash sangat besar. Namun,
jreng-jreng… keyakinan saya tidak terbukti setelah Lecture Security Technology saya menjelaskan hal
ini dengan baik sekali. Penjelasannya seperti ini:
Misalkan ada pesan
‘Hello’, pesan ini akan kita hash dengan algortima yang sederhana, yaitu
pertama-tama huruf-huruf tersebut akan kita ubah kedalam bilangan angka.
- a
menjadi 1
- b
menjadi 2
- c
menjadi 3
- dst…
Sehingga pesan 'hello' akan menjadi '8.5.12.12.15'. Kemudian kita jumlahkan
bilangan-bilangan tersebut sehingga kata 'hello' akan menghasilkan jumlah 52.
h
|
e
|
l
|
l
|
o
|
||||||
8
|
+
|
5
|
+
|
12
|
+
|
12
|
+
|
15
|
=
|
52
|
Kemudian langkah terakhir adalah kita ambil satu digit
yang paling belakang sebagai nilai hashnya, yaitu 2. Nah nilai hash 2 ini
bukankah bisa dibuat dari banyak kombinasi huruf? jumlah huruf pun juga bisa
bervariasi, tidak harus 5 seperti 'hello'. Berikut beberapa text yang memiliki hash 2.
Text
|
Integer
|
Sum
|
Hash
|
bye
|
2.25.5
|
32
|
2
|
confidential
|
3.15.14.6.9.4.5.14.20.9.1.12
|
112
|
2
|
enemy
|
5.14.5.13.25
|
62
|
2
|
dlsb…
|
Perlu dicatat disini, bahwa tabulasi diatas adalah
ilustrasi bagaimana hash dikatakan sebagai sebuah fungsi yang tidak dapat di
dekripsi. Dalam contoh diatas hasil hash sudah sangat acak sehingga kita tidak
dapat mengetahui lagi apakah sebuah hash yang ingin kita dekripsi memiliki
kandungan huruf e atau z atau m atau lainnya.
Kegunaan
Menurut Kaufman et.
al. (2002), Fungsi hash dapat digunakan sebagai:
- Menyimpan Password
- Sebagai Message Integrity
- Sebagai Message Fingerprint
Menyimpan Password
Password didalam
sebuah sistem dianjurkan untuk disimpan dengan menggunakan fungsi hash. Dengan
demikian administrator sistem tersebut sekalipun tidak akan dapat melihat atau
menggunakan password user yang telah menjadi membernya. Hal ini akan memberikan
impact yang baik kepada user bahwa baik sistem maupun administrator sangat
menghargai privasi dari anggotanya.
Selain itu pula, jika database password pengguna, dengan cara tertentu
dapat diakses oleh publik, maka siapapun tetap tidak langsung dapat
menggunakan password tersebut.
Untuk menggunakan password yang
telah publicly accessible terlebih dahulu seorang hacker
harus melakukan buteforce terhadap kumpulan password-password teresbut.
Message Integrity
Andaikata Alice
ingin mengirimkan pesan kepada Bob. Untuk mencegah ada seseorang ditengah
perjalanan yang ingin mengganti pesan tersebut, Alice melakukan hash terhadap
pesannya sendiri yang kemudian dikirim bersama dengan pesannya yang asli.
Namun, ternyata apa yang Alice lakukan tidak menjamin integritas keamanan pesan
miliknya. Seseorang tetap dapat mengubahnya dan menyediakan fungsi hash dari
pesan tersebut
Alice bermaksud
mengirimkan pesan ‘Hello Bob’ kepada Bob. Alice kemudian mengirimkan pesan
tersebut bersama dengan fungsi hash MD5 dari pesannya, yaitu
b4c9c3086946666f7ec8014629e105f7. Alice mengirimkan pesan dan hash MD5 nya
melalui jasa pengantar barang, TIKI. Ditengah perjalanan, Eve berhasil mencuri
pesan Alice untuk Bob dari sang kurir TIKI. Eve membuat pesan baru yang
berbunyi ‘Hello Honey’, membuat hash MD5 dari pesannya tersebut, dan
mengembalikannya kedalam tas sang Kurir tanpa sepengetahuan sang Kurir.
Kurir yang baik
hati tersebut memberikan pesan Alice tadi kepada Bob. Ketika Bob membacanya,
Bob merasakan ada yang aneh terhadap pesan tersebut. Bob mengecek hash MD5 dari
pesan yang dibacanya, namun pengecekan MD5 pesan yang diterima Bob dengan MD5
yang dikirim bersama paket tersebut cocok. Tapi apakah Bob tahu pesan yang
bertuliskan ‘Hello Honey’ tersebut memang berasal dari Alice?
Dalam kasus ini tentu saja Bob tidak memiliki cara untuk
mengetahui keabsahan pesan tersebut hanya dari paket yang berisi pesan dan MD5
yang katanya dikirim oleh Alice. Hal ini tidak akan terjadi jika Alice dan Bob
menggunakan sejumlah karakter rahasia yang hanya diketahui oleh kedua orang
tersebut. Karakter-karakter rahasia ini disebut juga dengan nama keyed hash. Penggunan karakter ini disebut sebagai
message integrity, dimana cara pengunaannya adalah sebelum dilakukannya hash,
Alice terlebih dahulu menggabungkan pesannya dengan karakter rahasia tersebut.
Jika pesan Alice adalah ‘Hello Bob’ dan
karakter rahasia Alice dan Bob adalah 1234, maka hasil hash yang dibuat oleh
Alice akan bernilai 508e1ae04417ccb03953aa2a320d1714. Jika Eve berhasil mencuri
pesan Alice tersebut dan menggantinya dengan pesan miliknya sendiri, dan karena
Eve tidak mengetahui karakter rahasia milik Alice dan Bob, Eve berasumsi bahwa
MD5 yang dikirim oleh Alice tidak mengikutsertakan keyed hash sehingga ia hanya
melakukan MD5 terhadap pesannya ‘Hello honey’ tersebut.
Bob yang kemudian menerima pesan yang kata sang kurir berasal dari Alice
mengecek integritas dari pesan yang katanya dari Alice tersebut dengan cara
menambahkan keyed hash miliknya kedalam pesan yang diterima tersebut. Setelah
dilakukan hash terhadap pesan 'Hello Honey1234' Bob dengan yakin dapat
mengatakan bahwa pesan tersebut bukan berasal dari Alice.
Pesan
|
Keyed Hash
|
MD5
|
‘Hello
Bob’
|
b4c9c3086946666f7ec8014629e105f7
|
|
‘Hello
Honey’
|
e42afb241fceefa05e3e897fa0686f14
|
|
‘Hello
Bob’
|
1234
|
508e1ae04417ccb03953aa2a320d1714
|
‘Hello
Honey’
|
1234
|
7dc14667a10ce5116b50f4d8a7e1ad9c
|
Message Fingerprint
Penggunaan Hash sebagai sidik jari pesan (message fingerprint) digunakan untuk mengecek apakah
file yang kita simpan masih sesuai dengan file asli ketika hash file tersebut
dibuat dan belum berubah. Jika terdeteksi adanya file yang tidak memiliki hash
yang sama dengan yang telah dibuat sebelumnya, maka dapat dipastikan bahwa file
tersebut telah berubah. Contoh: Pada bulan Januari 2008 Alice memiliki file
Bob.txt yang berisi profil mengenai Bob. Alice mengkomputasi hash dari file
tersebut sehingga diperoleh:
MD5(Bob.txt) --> f06defdef28e15706f974f6d080b57fe
Dua tahun kemudian
Alice membuka kembali file Bob.txt tersebut dan mencurigai ada yang tidak lazim
dari isi file tersebut. Alice kemudian membuat hash dari file Bob.txt tersebut
dan mendapatkan nilai hashnya.
MD5(Bob.txt) --> 5f3b147ae863e541701d7011e597e98b
Alice kemudian
menyadari bahwa hash file Bob.txt pada Januari 2010 berbeda dengan hash pada
bulan Januari 2008. Dengan demikian, dapat dipastikan bahwa seseorang telah
mengubah file tersebut antara Bulan Januari 2008 hingga Januari 2010.
Ketidak cocokan
message fingerprint tidak selama disebabkan karena ada manusia yang mengubah
file ataupun pesan tersebut. Terkadang message fingerprint tidak cocok antara 2
waktu dapat disebabkan oleh transfer file yang gagal, sektor pada hardisk
dimana sebuah file disimpan rusak, dan lain sebagainya. Jadi, tidak selamanya
manusia dapat disalahkan juga..
Karakteristik
Dobbertin (1996)
dalam artikelnya menyebutkan bahwa dalam membuat fungsi hash harus memenuhi
beberapa kriteria berikut:
- Relative
cepat dalam melakukan komputasi
- 2 buah
pesan yang berbeda tidak boleh memiliki nilai hash yang sama
- Bebas
dari serangan Birthday Attack (dari sebanyak 264 atau ~18 446 744 073 709 551 616 pesan
kemungkinan besar didapat 2 pesan yang memiliki nilai hash yang sama)
- 2
Pesan yang memiliki sangat sedikit perbedaan harus memiliki nilai hash
yang sangat berbeda (Kaufman et. al., 2002).
Algortima
Hash umumnya
disajikan dalam bentuk bilangan hexadecimal, yaitu kombinasi antara angka 0-9
dengan huruf a hingga f. Beberapa algoritma hash yang terkenal dan masih sering
digunakan hingga saat ini yaitu:
- md5
(Message Digest 5)
- SHA-1
(Secure Hash Algortihm 1)
- SHA-2
(Secure Hash Algorithm 2), yang meliputi 4 fungsi hash:
- SHA-224
- SHA-256
- SHA-384
- SHA-512
Algoritma MD5 dikembangkan oleh seorang Professor MIT yang
bernama Ronald L. Rivest. Istilah “MD” yang digunakan merupakan abrieviation
dari Message Digest. Perkembangan MD5 telah melalui 5 kali
revisi, dimana MD generasi pertama dan kedua di desain untuk membantu
algoritma RSA dalam melakukan
komputasi signature dari pesan rahasia
yang akan dikirim dan dienkripsi oleh RSA. Generasi ke
tiga dan empat MD hadir karena adanya persaingan dari algortima hash lain yang
bernama SNEFRU, yang memiliki keunggulan kecepatan pada proses komputasinya
dibandingkan MD2. Ketika ditemukan adanya celah keamanan dari SNEFRU pada tahun
1992, ditahun yang sama ditemukan pula kelemahan MD4, yang kemudian Profesor
Rivest segera menambal kelemahan tersebut dan menggantinya menjadi generasi ke
lima Message Digest, yaitu MD5. Dari kelima generasi ini, MD generasi pertama
dan ketiga merupakan algoritma yang tidak dipublikasikan. Sementara spesifikasi
algoritma MD2, MD4, dan MD5 terdapat dalam RFC1319, RFC1320, dan RFC1321.
Secure Hash Algoritm (SHA) dikembangkan oleh National
Institute and Standard Technology (NIST) pertama kali pada tahun 1993. Generasi
pertama SHA diberi nama SHA-0. Kemudian pada
tahun 1995, generasi kedua SHA, SHA-1, muncul dan
dipublikasikan oleh NIST dengan kode publikasi FIPS PUB 180-1. Generasi kedua
SHA ini muncul dalam waktu 12 jam dari setelah dilaporkannya terdapat kelemahan
dalam algoritma SHA-0. Generasi ketiga algortima SHA, SHA-2, dipublikasikan pada tahun 2001 dengan berbagai
pilihan jumlah bit yang digunakan, yaitu: 224, 256, 384, dan 512. Baik SHA-1
dan SHA-2 pada dasarnya memiliki algortima yang serupa, hanya berbeda di jumlah
karakter outputnya saja. SHA-1, SHA-256, dan SHA-516 memiliki jumlah karakter
output masing-masing secara berurutan adalah 40, 32, dan 64.