Pikiran terbaik adalah tidak menemukan kembali roda. Tapi, saya mengerti, di dunia PHP mungkin sulit untuk menemukan komponen berkualitas tinggi yang sudah melakukan itu (bahkan saya cukup yakin bahwa kerangka kerja mengimplementasikan hal-hal seperti itu dan implementasinya sudah diuji, solid, ditinjau kode, dll. )
Jika, karena beberapa alasan, Anda tidak bisa menggunakan kerangka kerja, inilah beberapa saran:
Gunakan PBKDF2 atau Bcrypt jika Anda bisa . Itu dilakukan untuk itu.
Dasar Pemikiran: kedua algoritme dapat membuat proses hashing menjadi lambat secara sewenang-wenang, yang persis seperti yang Anda inginkan ketika hashing password (alternatif yang lebih cepat berarti kekuatan kasar yang lebih mudah). Idealnya, Anda harus menyesuaikan parameter sehingga proses menjadi lebih lambat dan lebih lambat dari waktu ke waktu pada perangkat keras yang sama, sementara perangkat keras baru yang lebih cepat dirilis.
Jika Anda tidak bisa, setidaknya jangan gunakan MD5 / SHA1. Tak pernah. Lupakan itu . Gunakan SHA512 sebagai gantinya, misalnya. Gunakan garam juga.
Dasar Pemikiran: MD5 dan SHA1 terlalu cepat. Jika penyerang memiliki akses ke database Anda yang berisi hash dan memiliki (bahkan tidak terlalu) mesin yang kuat, kasar memaksa kata sandi cepat dan mudah. Jika tidak ada garam, kemungkinan penyerang menemukan kata sandi yang sebenarnya meningkat (yang bisa membahayakan tambahan jika kata sandi itu digunakan kembali di tempat lain).
Di PHP 5.5.0 dan yang lebih baru, gunakan password_hash
dan password_verify
.
Dasar Pemikiran: memanggil fungsi yang disediakan oleh kerangka kerja itu mudah, sehingga risiko membuat kesalahan berkurang. Dengan kedua fungsi tersebut, Anda tidak perlu memikirkan parameter yang berbeda seperti hash. Fungsi pertama mengembalikan string tunggal yang kemudian dapat disimpan dalam database. Fungsi kedua menggunakan string ini untuk verifikasi kata sandi.
Lindungi diri Anda dari kekerasan . Jika pengguna mengirimkan kata sandi yang salah ketika dia sudah mengirimkan kata sandi yang salah lain 0,01 detik yang lalu, itu alasan yang baik untuk memblokirnya. Sementara manusia bisa mengetik cepat, mereka mungkin tidak dapat yang cepat.
Perlindungan lain adalah dengan menetapkan batas kegagalan per jam. Jika pengguna mengirimkan 3600 kata sandi yang salah dalam satu jam, 1 kata sandi per detik, sulit untuk percaya bahwa ini adalah pengguna yang sah.
Dasar Pemikiran: jika kata sandi Anda di-hash dengan cara yang tidak aman, brute force bisa sangat efektif. Jika kata sandi disimpan dengan aman, brute force masih menyia-nyiakan sumber daya server dan bandwidth jaringan Anda, menyebabkan kinerja yang lebih rendah untuk pengguna yang sah. Deteksi brute force tidak mudah untuk dikembangkan dan dilakukan dengan benar, tetapi untuk sistem apa pun kecuali yang kecil, itu sangat berharga.
Jangan meminta pengguna Anda untuk mengubah kata sandi mereka setiap empat minggu. Ini sangat menjengkelkan dan mengurangi keamanan, karena mendorong keamanan berbasis post-it.
Dasar Pemikiran: gagasan bahwa memaksa kata sandi untuk diubah setiap n minggu melindungi sistem dari brute force adalah salah. Serangan brute force biasanya berhasil dalam hitungan detik, menit, jam atau hari, yang membuat perubahan kata sandi bulanan tidak relevan. Di sisi lain, pengguna buruk dalam mengingat kata sandi. Jika, lebih dari itu, mereka perlu mengubahnya, mereka akan mencoba menggunakan kata sandi yang sangat sederhana atau hanya mencatat kata sandi mereka pada post-it-nya.
Audit segalanya, setiap saat. Simpan log masuk, tetapi jangan pernah menyimpan kata sandi dalam log audit. Pastikan bahwa log audit tidak dapat dimodifikasi (yaitu Anda dapat menambahkan data di akhir, tetapi tidak mengubah data yang ada). Pastikan bahwa log audit tunduk pada cadangan reguler. Idealnya, log harus disimpan pada server khusus dengan akses yang sangat ketat: jika server lain diretas, penyerang tidak akan dapat menghapus log untuk menyembunyikan keberadaannya (dan jalur yang diambil selama serangan).
Jangan ingat kredensial pengguna dalam cookie, kecuali jika pengguna meminta untuk melakukannya (kotak centang "Ingat saya" harus tidak dicentang secara default untuk menghindari kesalahan manusia).