Beberapa waktu yang lalu saya menghubungi support dari penyedia domain saya untuk meminta bantuan lewat chat. Sebagai autentikasinya, operator meminta saya menuliskan 3 huruf terakhir dari password saya. Hal ini sangat mengejutkan saya karena artinya website tersebut menyimpan password saya apa adanya (plain text) dan juga operator dari chat tersebut bisa membacanya! Yang lebih mengejutkan lagi, operator chat tersebut ternyata adalah karyawan outsource! Ini sangat berbahaya sekali dalam berbagai tingkatan, karena:
- Jika website tersebut dihack, maka si hacker bisa mendapatkan semua password dari member di website tersebut. Dan user umumnya (termasuk saya) menggunakan password yang sama untuk beberapa akun. Sehingga sang hacker bisa masuk tidak hanya di website tersebut, tetapi website lainnya juga menggunakan akun saya. Dan ini sudah berkali-kali terjadi seperti di sini dan di sini.
- Jika staff untuk support saja bisa membaca password dari member, bagaimana dengan programmer, manager dan karyawan lainnya. Apakah anda yakin tidak ada satu pun orang yang akan menyalahgunakan 'kekuatan' tersebut? Terlebih lagi jika ternyata ada staff outsource yang tidak terikat secara langsung pun bisa membacanya. Bukannya su'udzon, tetapi sistem yang buruk cenderung menghasilkan manusia yang korup.
- Menyimpan password secara plain text adalah salah satu indikator bahwa tim engineering dari perusahaan tersebut tidaklah kuat. Jika hal sesederhana seperti mengamankan password saja tidak dilakukan, apalagi hal rumit lainnya yang menyangkut keamanan. Mungkin data anda lainnya di perusahaan tersebut pun ada dalam bahaya.
"Power tends to corrupt.." - John Dalberg-Acton
Sekarang Internet sudah dewasa dan semakin canggih, jika aplikasi anda masih menyimpan password secara plain text sebaiknya anda segera buka code aplikasi anda dan amankan segera password member di database anda. Untuk mengamankannya, kita menggunakan hash.
Fungsi Hash
Fungsi ini berguna untuk memetakan suatu masukan (input) sepanjang apapun menjadi keluaran (output) dengan panjang yang tetap. Setelah mendapatkan output dari fungsi hash maka tidak akan ada cara untuk mendapatkan inputnya! Sehingga jika anda menyimpan password member anda dalam bentuk hash, maka siapapun yang akan mendapatkan akses ke database anda akan mengalami kesulitan untuk mendapatkan password aslinya. Untuk melakukan hash, anda bisa melakukannya seperti ini di PHP:
$cost = 10;
$hash = password_hash("password_member", PASSWORD_BCRYPT, ["cost" => $cost]);
password_hash() adalah fungsi hash di PHP yang akan memproses input, dalam hal ini "password_member", menjadi keluaran dalam bentuk hash ($hash). Nantinya $hash ini disimpan di dalam database dan digunakan untuk autentifikasi user. Untuk amannya, di database pastikan kolom dari hash bisa menyimpan 255 karakter. Jika anda menggunakan PostgreSQL script sederhananya seperti ini:
CREATE TABLE anggota (
username bigserial primary key,
password varchar(255) NOT NULL
);
PASSWORD_BCRYPT merujuk ke algoritma yang digunakan dalam hash ini, yang mana adalah algoritma bcrypt. Algoritma ini sangat disarankan untuk digunakan. Algoritma lain yang dapat anda gunakan adalah varian dari SHA2.
Disebutkan sebelumnya bahwa fungsi hash hanya berjalan satu arah karena dengan memiliki input kita bisa mendapatkan output, tetapi dari output kita tidak akan bisa mendapatkan inputnya. Walaupun demikian tetap saja ada cara untuk mendapatkan inputnya, yaitu dengan brute force. Brute force adalah teknik untuk mencoba input satu persatu hingga didapatkan output yang sama. Dengan cara ini input atau password yang asli akan dengan mudah didapatkan. Untuk mempersulit brute force, kita lakukan hashing berkali-kali. Sehingga waktu untuk melakukan brute force akan terlalu lama sehingga si hacker akan menyerah dan berpindah ke target yang lebih mudah.
$cost adalah parameter yang digunakan untuk menentukan seberapa banyak hash dilakukan. Untuk bcrypt, jika nilainya adalah 10 maka hashing akan dilakukan sebanyak 2^10 atau 1024 kali. Ini cukup aman karena dengan komputer biasa dalam satu detik kurang dari 7 password yang bisa dicoba. Jika password asli user adalah 8 karakter alpha numeric yang acak, maka akan dibutuhkan waktu sekitar 12 ribu tahun untuk membongkarnya! Jika anda menggunakan shared hosting (untuk tidak menganggu pengguna yang lain), maka $cost sebesar 8 atau 9 sudah cukup.
Autentifikasi dengan hash
Untuk mengautentifkasi member kita bisa melakukannya seperti berikut di PHP:
// Nilai $hash diambil dari database
// Nilai $password diambil dari form yang dikirimkan oleh user
if (password_verify($password, $hash)) {
echo 'Password benar!';
} else {
echo 'Password salah!';
}
Kerugian dari hashing di aplikasi anda adalah proses autentifikasi akan berjalan sedikit lebih lambat. Seberapa lambat? Umumnya sebanyak 10 milisecond hingga 150 milisecond bergantung kepada kecepatan dari server dan seberapa banyak $cost yang digunakan. Untuk pengguna, saya yakin mereka tidak keberatan jika itu artinya password mereka akan lebih aman.
Umumnya tutorial tentang hash akan membawa kita untuk berbicara tentang salt, tetapi tak perlu khawatir, dengan password_hash() itu semua sudah dilakukan secara otomatis. Untuk yang belum tahu, salt adalah suatu cara untuk membuat output anda seunik mungkin dengan menambahkan text random dan unik untuk setiap passwordnya. Anda pun tidak perlu mengabungkan algoritma-algoritma karena percuma saja, jika hacker sudah mendapatkan akses ke database, kemungkinan besar dia sudah mendapatkan akses ke code anda.
Jangan gunakan enkripsi
Yang sering dibicarakan di forum-forum adalah menggunakan enkripsi (misalnya AES, RSA, Blowfish, dll) untuk menyimpan password. Ide yang buruk, jangan lakukan itu. Sangat mudah sekali mendapatkan password yang asli karena enkripsi ini berjalan dua arah. Jika anda sudah memiliki outputnya (yang disimpan di database) maka dengan mudah kita mendapatkan inputnya (password asli user).
Penyimpanan password di CodeSaya
CodeSaya sangat memahami betapa pentingnya keamanan password member kami. CodeSaya menggunakan Django sebagai backend dan manajemen password django secara default menggunakan algoritma SHA256 dan hashing dilakukan sebanyak 10.000 kali. Nilai 10.000 kali diperlukan karena SHA256 itu lebih cepat dibandingkan bcrypt. Sehingga penyimpanan password di CodeSaya sudah cukup aman. Codesaya tidak tahu sama sekali password yang anda gunakan di sini!
Kesimpulan
Seperti yang sudah anda lihat bahwa sangat mudah sekali untuk mengamankan password dari user anda dan juga kerugiannya hampir tidak ada. Bahkan sudah ada website yang mengumpulkan 'penjahat-penjahat' yang menyimpan password user secara plain text. Jangan sampai perusahaan anda ada di situ. Jadi tunggu apalagi segera buka laptop anda (kecuali kalo sudah dibuka) dan segera coding! Tunjukkan bahwa anda menghargai member anda!
Level artikel ini adalah beginner.
Dituliskan oleh
Ganis (ganis)
pada 4 Agustus 2015 dan telah dibaca sebanyak 15630 kali.
Tag:
PHP,
Tutorial,
Keamanan
Komentar:
ganis
198
841
penulis
·
9 tahun, 3 bulan yang lalu
·
0 jempol
Sama2 @zulhilmi, iya emang sebenernya ini bisa dibawa rumit bahasannya, tapi emang sengaja gak dibuat teknis bgt tapi bisa dengan mudah diaplikasikan ke code yg ada. Bagaimana, apakah website anda sudah menyimpan password member dengan aman? ^^
puntodamar
190
10
·
9 tahun, 3 bulan yang lalu
·
1 jempol
kalau cuma pakai method md5 ?
ganis
198
841
penulis
·
9 tahun, 3 bulan yang lalu
·
2 jempol
@puntodamar oh, maaf telat membalasnya ^^ sebaiknya jangan gunakan md5 karena: 1. proses hashing terlalu cepat 2. secara kriptograpi dikenal lemah untuk no 1, solusinya hashing bisa dilakukan lebih dari 100.000 kali atau bahkan satu juta kali. Untuk no 2, saya bukan ahli matematika atau master kriptografi jadi tidak mengerti kenapa dianggap lemah. Tetapi, banyak sumber yang mengatakan demikian (silahkan google). Dan lagi, menggunakan algoritma yang lain semudah mengganti satu baris code saja. TIdaklah sulit. Jika anda sudah terlanjur menggunakan md5 dan ingin mengganti ke algoritma yang lain, mungkin bisa melakukan dua kali pengecekan, seperti berikut: // Nilai $hash diambil dari database // Nilai $password diambil dari form yang dikirimkan oleh user // cek_dengan_md5() adalah fungsi buatan anda untuk // memeriksa $password terhadap hash md5 nya if (cek_dengan_md5($password, $hash)) { echo 'Password benar!'; // selanjutnya simpan hash baru ke DB // dengan fungsi yang anda buat sendiri simpan_hash_baru($password); } else { if (password_verify($password, $hash)) { echo 'Password benar!'; } else { echo 'Password salah!'; } }
abrahamSN
123
0
·
9 tahun, 3 bulan yang lalu
·
1 jempol
saya biasanya cuma hash ampe 2 kali aja. >.< karna saya juga penasaran apa yang client lakuin. :v
ganis
198
841
penulis
·
9 tahun, 3 bulan yang lalu
·
0 jempol
@abrahamSN penasaran? Maksud anda, anda ingin tau apa password mereka? lalu masuk ke akun-akun mereka yang lainnya? :-0
abrahamSN
123
0
·
9 tahun, 3 bulan yang lalu
·
0 jempol
ya gitu lah >.< hahahaha
abrahamSN
123
0
·
9 tahun, 3 bulan yang lalu
·
1 jempol
keuntungan nya bukan dari apa yang mereka lakukan sih. tapi itung" bisa bikin data wordlist password sendiri, berdasarkan client" yang ada.
coby
109
14
·
9 tahun, 3 bulan yang lalu
·
1 jempol
bagus sekali mas ganis infonya.. sempet kepikiran ttg ini..tapi saya sendiri blm seberapa mengerti ttg hash.. al hasil mash mnggunkan md5....
ganis
198
841
penulis
·
9 tahun, 3 bulan yang lalu
·
0 jempol
@abrahamSN semoga anda gunakan untuk hal-hal yang baik wordlist tersebut @coby senang bisa membantu, semoga semakin banyak yang menjaga privasi dari anggota website2 di Indonesia. Bukan apa2, saya dan anda2 juga adalah salah satu anggotanya.
oketobali
87
2
·
9 tahun yang lalu
·
2 jempol
user password adalah hal yg krusial dan confidential, harusnya gk ada yg boleh tau selain user itu sendiri, bahkan google menyediakan 2-step verification saat login untuk memproteksi usernya. untuk hashing password memang benar kata mas @ganis, pke sha256 + salt, biar aman, jadi klo user lupa password, mereka bakalan diminta bikin password baru lagi, tentunya ada verifikasi tuk hal tersebut maju terus codesaya.com
abdulah
29
0
·
8 tahun, 11 bulan yang lalu
·
0 jempol
saya nyimak dulu aja kk :3 maklum newbie :v
ur__DNA
131
53
·
8 tahun, 3 bulan yang lalu
·
0 jempol
Apa karena ini ya? Tapi gimana? Boro2 motif nya yang ngrusak. Lah mau benahin dari mana aja belom tau, Apa lagi sampe ke hash. Semoga aku sanggup!
Artikel Lainnya
mrfreedom
13 Agustus 2015Kenapa Open Source ?
Halo codesaya. well, kenalkan saya cuma orang kebetulan lewat website ini dan kebetulan juga sangat mencintai dan sangat tertarik dengan open source. saya suka menyebarkan "virus2" untuk memulai menggunakan open ...
6 menit bacaan · beginner
Ganis
4 Agustus 2015Teknologi Dibalik CodeSaya, Sebuah Permulaan
Cukup banyak pertanyaan tentang apa teknologi di balik CodeSaya. Bahkan ada yang berspekulasi bahwa CodeSaya dibuat dengan wordpress. Seriously, wordpress? Untuk menghindari pencemaran nama baik berbagi dengan teman-teman developer yang ...
9 menit bacaan · beginner
zulhilmi300
38
·
9 tahun, 3 bulan yang lalu
·
2 jempol