Saturday, June 13, 2015

Cara Menyimpan Password di Database

'Stef, apa yang bikin sistem bisa tahu password para pengguna nya?'
Jawaban gw: 'Bisa iya, bisa enggak, tergantung gimana cara kita menyimpan password di database.'

Kalo mengikuti standard umum, pada sistem apapun, baik CEO, direktur, manager, system analyst, programmer, tukang bersih-bersih di kantor, atau siapapun, ga akan pernah bisa tau password seseorang. Yap, termasuk database administrator.

Mengapa begitu?

Gw yakin para pembaca sangat familiar dengan Facebook. Kita ambil contoh sistem semacam Facebook, sebut saja Funbook. Ada seseorang berinisial A, ingin membuat akun Funbook. Dia masukin data-data pribadinya, email 'saya_keren_sekali@email.com' dan passwordnya, 'sangatrahasia'.

Data-data ini tentunya akan tersimpan di dalam database. Sehingga di dalam database, akan ada user 'A', dengan email 'saya_keren_sekali@email.com', dan password... Eit, tunggu dulu. Kita tidak boleh menyimpan password 'sangatrahasia' di dalam database! Password yang kita simpan adalah password yang sudah melalui di hash atau yang sudah melalui proses hashing.

Sebelum gw ngomongin hash, mungkin sebaiknya gw ngomongin kriptografi dulu. Bahasa simpelnya, kriptografi itu ilmu yang mempelajari bagaimana suatu pesan dapat dikirim dengan aman, serta memastikan kalo orang yang menerima pesan tersebut adalah orang yang tepat. Salah satu tipe kriptografi yang paling terkenal adalah enkripsi (encryption) dan dekripsi (decryption).

Contoh: A mau ngirim pesen ke B yang isinya 'rahasia'. Tentu saja A dengan B sudah sepakat bagaimana proses untuk mengenkrip dan mendekrip data, yang biasanya disebut dengan kunci. Sebelum dikirim, esan tersebut harus dienkripsi dulu, supaya orang lain, kecuali si B, tidak mengerti.
  • Pesan asli: rahasia
  • Kunci: Setiap huruf ditambah satu, a menjadi b, b menjadi c, dan seterusnya, sampai z menjadi a.
  • Pesan setelah enkripsi: sbibtjb
Proses Enkripsi
Pesan 'sbibtjb' itu pun dikirim ke B. Si C mungkin saja mengintip pesan tersebut. Tapi karena si C tidak tahu kuncinya, si C hanya melihat huruf-huruf berantakan yang tidak dapat dimengerti. Pesan itu kemudian sampai di B. Dengan menggunakan kebalikan dari kunci yang sama, si B pun bisa mendapatkan pesan asli tersebut.
  • Pesan setelah enkripsi: sbibtjb
  • Kunci: Kebalikan dari kunci yang sama. Setiap huruf dikurangi satu, a menjadi z, b menjadi a, dan seterusnya.
  • Pesan asli: rahasia.
Proses Dekripsi
Mudah bukan?

Lah, terus, apa bedanya dengan hash? Hash merupakan salah satu tipe kriptografi. Bedanya, kalo enkripsi, pesan yang kita enkrip bisa kita dekrip kembali, asalkan kita tahu kuncinya. Kalo hash, pesan yang sudah kita hash, tidak akan bisa kembali seperti semula lagi. Maka itu hash juga disebut one-way hashing atau enkripsi satu arah. Karena itu hashing sangat efektif untuk menyimpan password.

Contoh 1:
Algoritma: Jumlah karakter dari password.

  • Simpel (Yang tersimpan di dalam database: 6)
  • Rahasia (Yang tersimpan di dalam database: 7)
  • Stef keren ^~* (Yang tersimpan di dalam database: 14)

Sekarang coba tebak, dengan menggunakan algoritma yang sama, kalo yang tersimpan di dalam database adalah 10, apa password nya?

Mungkin pembaca bakal bertanya: Kalo ada user A password aslinya ''Mobil' dan user B password aslinya 'Motor'. Dua-duanya bakal disimpan di dalam database sebagai '5', donk?

Betul sekali. Inilah yang dinamakan dengan hash collision. Hash collision terjadi karena lemahnya algorima hash sehingga dua input yang menghasilkan hash yang sama. Yaahh, namanya juga contoh, yang penting mengerti konsepnya dulu. Kalo dikasih yang rumit, ntar malah makin bingung.


Contoh 2: 
Kali ini kita gunakan angka sebagai password, supaya lebih mudah untuk dimengerti.
Algoritma: [Password] x 1234 + 8, diambil digit ke 2, 3, dan 4.
  • 1 x 1234 + 8 = 1242 (Yang tersimpan di dalam database: 242)
  • 2 x 1234 + 8 = 2476 (Yang tersimpan di dalam database: 476)
  • 5 x 1234 + 8 = 6178 (Yang tersimpan di dalam database: 178)
  • 88  x 1234 + 8 = 108600 (Yang tersimpan di dalam database: 086)
  • 1825  x 1234 + 8 = 2252058 (Yang tersimpan di dalam database: 252)

Sekarang coba tebak, dengan menggunakan algoritma yang sama, kalo yang tersimpan di dalam database 098, berapakah password aslinya? Ga mungkin bisa ketemu kan? Kecuali kita coba satu-satu dari 1,2,3 dan seterusnya.
Proses hash
Semakin kuat algoritma hash, semakin kecil kemungkinan terjadinya hash collision, dan semakin sulit pula algoritmanya untuk kita mengerti.

Mungkin ada yang nanya, ''Lah, kalo password aslinya ga bisa didapet, gimana cara kita validasi password?''

Ooohh mudah. Untuk validasi, kita ga perlu tau password asli kok. Misalnya ada user B, password aslinya 2 (yang tersimpan dalam database: 476). Saat dia masukin angka 5, sistem akan menggunakan algoritma yang sama (x 1234 + 8, dan diambil digit ke 2, 3, dan 4), maka akan didapat angka 178. Password yang tersimpan dalam database (476) tidak sama dengan 178, maka password salah.

Karena sulitnya mendapatkan password asli (bahkan nyaris tidak mungkin), apabila kita lupa password kita, sistem akan mengirimkan link ke email kita untuk me-reset password. Kalo sampe ada sistem yang mengirimkan password asli kita melalui email, itu tandanya sistem tersebut kurang aman, karena menyimpan password asli (tanpa di hash) di dalam database.

Cukup jelas, bukan? Tentu saja contoh di atas algoritma nya dibuat semudah mungkin supaya pembaca lebih mudah memahami konsepnya. Kenyataannya, jauh lebih ribet daripada itu. Apalagi para ahli kriptografi terus menerus melakukan penelitian untuk memperkuat algoritma hash. Saat ini, algoritma hash yang umum digunakan adalah Secure Hash Algorithm (SHA) 1. Dan sampai saat artikel ini ditulis, belum pernah ditemukan hash collision dalam algoritma SHA1.

Jadi, selama ini, apakah gw tau password user yang menggunakan sistem gw?
100% tidak. Gw pasti menggunakan hash. Ini merupakan salah satu kode etik yang harus dijunjung tinggi semua yang terlibat dalam proses pembuatan software.

1 comment: