Kamis, 20 Juli 2017

Kriptografi 3. MD5 dan Hashing

MD5 dan Hashing
Jika sebelumnya kita membahas tentang enkripsi kali ini kita akan membahas salah satu jenis hashing yaitu md5. Hashing adalah suatu formula, atau suatu algoritma satu arah untuk mengidentifikasi suatu data. Dua tipe data yang identik memiliki hash yang sama. Yang berbeda antara hashing dengan enkripsi adalah hasil hash tidak dapat dikembalikan menjadi data awal. Sehingga hashing disebut dengan algoritma satu arah. Ada banyak hashing yang biasa kita temui, kali ini kita akan membahas tentang MD5.
Hash MD5 berukuran 16 byte. Jika kita mengubah satu karakter saja pada string yang di hash, maka hash akan berbeda sangat jauh, sehingga hash md5 dapat digunakan untuk mendeteksi kerusakan pada file.
Dengan menggunakan bash
alfakatsuki@justPC:~$ echo -n 'a' | md5sum
0cc175b9c0f1b6a831c399e269772661  -
Dengan menggunakan python
import hashlib
print hashlib.md5("a").hexdigest()
Sebagai contoh penggunaan md5 untuk mendeteksi kerusakan file adalah sebagai berikut. Saya akan membuat file bernama testbinary.txt
alfakatsuki@justPC:~$ echo 'AAAAAAAAAA' > testbinary.txt
alfakatsuki@justPC:~$ cat testbinary.txt
AAAAAAAAAA
testbinary.txt berisi 10 karakter A dan diakhiri newline diakhir. Kita cari md5sum nya menggunakan bash saja.
alfakatsuki@justPC:~$ md5sum testbinary.txt
86d48f739677a6bc11751a9a3fd4a0d1  testbinary.txt
Kita coba kalau satu karakter tadi B nya
alfakatsuki@justPC:~$ echo 'AAAAAAAAAB' > testbinary.txt
alfakatsuki@justPC:~$ cat testbinary.txt
AAAAAAAAAB
alfakatsuki@justPC:~$ md5sum testbinary.txt
5542eaca4309f3aa71bf384f23eeb966  testbinary.txt
Hash yang dihasilkan sangat jauh berbeda.
Hash juga digunakan untuk menyimpan password sehingga pihak server pun tidak mengetahui password yang sebenarnya. Password yang dikirim user, dihash, dan hash tersebut disimpan sebagai pencocok apabila user akan login. Sehingga apabila server diserang, keamanan pengguna masih tetap terjaga.
Namun walaupun tidak dapat direverse, hash masih bisa dikembalikan dengan metode bruteforce. Kumpulan word di hash lalu disimpan di internet sebagai database dari word sebelum dihash. Begitulah cara decrypt md5 bekerja dengan mencocokan hash md5 dengan database hash yang dimiliki oleh web tersebut.
Namun beberapa password menggunakan padding atau karakter sampah pada plain text sehingga tidak akan didapat hash yang sama pada database. Kita akan mencoba menyelesaikan soal sederhana untuk mendekrip hash yang memiliki padding.

Quest.

Saya memiliki hash 596d4043ad79fc82e7f496daff8dc8e9. String asli dari hash ini adalah "SARAPANKUY" dengan padding 1 byte di kiri dan satu byte dikanan string. Tugas kita adalah mengirim flag padding yang digunakan dengan format CTF{"hexapaddingkiri"+"hexapadingkanan"}. Contoh jawaban. CTF{'\x41\x41'}
Kita dapat menggunakan python untuk membruteforce byte tersebut. Byte berkisar dari 0x00 sampai 0xff.
import hashlib
string = "SARAPANKUY"
hashtrue = "596d4043ad79fc82e7f496daff8dc8e9"
kelar = 0
#untuk membruteforce byte kiri
for i in range(0x00, 0xff):
  if kelar == 1:
    break
  #untuk membruteforce byte kanan
  for j in range(0x00, 0xff):
    if kelar == 1 :
      break
    stringbaru = chr(i) + string + chr(j)
    hashbaru = hashlib.md5(stringbaru).hexdigest()
    print hex(i), hex(j), hashbaru, hashtrue
    if hashbaru == hashtrue:
      kelar = 1
# 0x99 0x99 596d4043ad79fc82e7f496daff8dc8e9 596d4043ad79fc82e7f496daff8dc8e9
Kita berhasil mendapatkan flagnya. yaitu '\x99' dan '\x99'. CTF{'\x99\x99'}
Sekian yang dapat saya bagikan. Semoga bermanfaat bagi kita semua :).

Tidak ada komentar:

Posting Komentar