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.

Related Posts:

  • Flappy Bird Ada yang tahu game Flappy Bird yang dulu sempat nge-trend banget? Itu lho, game yang simpel, ga perlu mikir, bisa dimainin tanpa koneksi, agak nyebelin (apalagi suaranya!), tapi bikin banyak orang kecanduan. Ternyata, gam… Read More
  • Aneka Tips Ngaco: Cara Cepat dan Mudah Bikin Virus Tanpa Coding Note: Ini sebenarnya bukan virus, kok. Ini cuma program buat ngisengin orang. Sebaiknya, pilih korban yang gaptek dan gampang panik. Jangan pililh orang tua atau teman yang psycho, nanti kalian malah repot sendiri. Vir… Read More
  • Curhatan Anak Kuliahan: Pemilihan Judul Skripsi Ngomong-ngomong soal Tugas Akhir (TA), atau yang lebih dikenal sebagai skripsi, gw akan bercerita sedikit gimana skripsi di kampus gw. Di sini, skripsi biasa dikenal dengan nama Final Year Project (FYP) atau Final Project (F… Read More
  • Aneka Tips: Sukses Interview Untuk Software Engineer (Dayton High School, 2015) Postingan kali ini, gw mau berbagi tips interview, khususnya buat yang mau jadi software engineer: Berikut tips-tips nya: Belajar! Interview itu bukan cuma dateng buat ngobrol-ngobrol. Tapi ak… Read More
  • Curhatan Anak Kuliahan: Kuliah di Luar Negri? Siapa Takut! Ilustrasi Toga (PRiscope, 2014) Gw kuliah di luar negeri yang memang bukan negara yang elit-elit amat: Malaysia - Kuala Lumpur. Ambil jurusan IT (Information Technology), spesialisasi di Intelligent Systems (juga dikenal … Read More

1 comment: