Kata sandi tidak boleh disimpan dalam teks biasa karena alasan keamanan yang jelas: Anda harus menyimpan hash, dan Anda juga harus membuat hash dengan hati-hati untuk menghindari serangan tabel pelangi.
Namun, biasanya Anda memiliki persyaratan untuk menyimpan n kata sandi terakhir dan untuk menerapkan kompleksitas minimal dan perubahan minimal antara kata sandi yang berbeda (untuk mencegah pengguna menggunakan urutan seperti Kata Sandi_1, Kata Sandi_2, ..., Kata Sandi_n ). Ini mungkin sepele dengan kata sandi teks biasa, tetapi bagaimana Anda bisa melakukannya dengan hanya menyimpan hash?
Dengan kata lain: bagaimana mungkin menerapkan mekanisme riwayat kata sandi yang aman?
Jawaban:
Simpan hash dan verifikasi kata sandi yang dimasukkan terhadap hash yang disimpan, dengan cara yang sama seperti Anda memverifikasi kata sandi saat masuk. Anda harus membuat kata sandi 'alternatif' dari kata sandi yang diberikan berdasarkan pola numerik untuk mendeteksi perubahan 'minimal' Anda.
Saat login, Anda memverifikasi kata sandi yang dimasukkan terhadap hash, tidak perlu menyimpan kata sandi dalam plaintext. Trik yang sama berfungsi saat mengubah kata sandi, cukup periksa kata sandi yang dimasukkan dan 'perubahan minimal' yang dihasilkan terhadap hash historis. Jika kata sandi baru memuaskan, pindahkan hash kata sandi saat ini ke kumpulan riwayat, dan ganti dengan hash baru untuk kata sandi baru.
sumber
Ketika pengguna mengubah kata sandi mereka, minta mereka memasukkan kata sandi sebelumnya. Anda sekarang memiliki akses ke dua kata sandi teks biasa, meskipun Anda tidak menyimpan kata sandi teks biasa dalam basis data Anda.
Lakukan verifikasi apa pun yang Anda inginkan pada kedua kata sandi ini. Ini tidak akan mencegah pengguna untuk berganti-ganti antara dua kata sandi (dengan akhiran - Anda dapat mencegah pergantian langsung sesuai saran dalam jawaban lain), tetapi itu akan mencegah kasus yang lebih mencolok.
sumber
potatoSalad1
dan mereka ingin memperbaruipotatoSalad2
, Anda memberi tahu perubahannya terlalu kecil karena Anda memiliki kedua kata sandi teks biasa pada saat itu. Tetapi lebih jauh dari itu, Anda hanya memiliki hash, dan sifat hash adalah bahwa Anda tidak dapat mengatakan apakah dua hash memiliki teks biasa yang sama atau sangat berbeda sebagai input.untuk menambahkan jawaban @ martijnPieter, perubahan minimal dapat diimplementasikan dengan melakukan brute force pendek berdasarkan kata sandi baru dan sebelumnya (yang Anda berdua telah tersedia)
misalnya Anda dapat mengulangi semua kata sandi dengan jarak tempuh 1 atau 2 dari kata sandi baru dan melihat apakah cocok dengan pass lama
tetapi Anda mungkin ingin mencatat bahwa ini dapat mengurangi kepercayaan pengguna bahwa Anda hashing passwords (karena Anda pada dasarnya mengatakan Anda bisa mendapatkan kembali kata sandi sebelumnya untuk menolak kata sandi baru)
sumber
Ini benar-benar lebih merupakan tambahan dari jawaban cerdas @ Brian. Tutup juga ke @Martijn Pieters untuk menambahkan rincian tentang cara memaksa paksa kata sandi lama berdasarkan yang sekarang dan ke @ scratchet freak untuk "jarak hamming." Saya tidak menghapus jawaban saya karena saya pikir ini memberikan latar belakang yang menarik untuk mendukung mereka.
Penyimpanan kata sandi yang canggih membutuhkan penggunaan beberapa putaran hash kriptografis satu arah yang kuat (SHA-512 +) dengan garam unik (128-bit +) untuk setiap pengguna. Tetapi jangan tergoda untuk menyimpan informasi tambahan tentang setiap kata sandi. Semakin banyak informasi yang Anda simpan tentang setiap kata sandi, semakin Anda merusak keamanan algoritma hashing Anda.
Contoh
Pertimbangkan betapa mudahnya memaksakan kata sandi jika Anda tahu itu:
Papan ketik AS memiliki 95 karakter yang dapat dicetak, sehingga mengetahui bahwa kata sandinya panjangnya 7 karakter menghasilkan 95 ^ 7 = 69.833.729.610.000 = 7x10 ^ 13 permutasi. Jika itu benar-benar acak, mungkin butuh waktu satu tahun untuk memecahkan ini pada prosesor 3Ghz tunggal. Tapi:
Jadi (dikoreksi berkat @Hellion):
Itu 50.000 kali lebih mudah retak! Menyimpan informasi yang baik untuk mencegah kata sandi yang sama dalam kasus ini telah menghabiskan waktu Anda untuk kata sandi 7-karakter dari setahun hingga beberapa jam. Decoding semua kata sandi Anda dengan desktop multi-prosesor yang kuat dengan kartu video yang bagus dan sedikit kesabaran sekarang sangat layak. Saya harap contoh sederhana ini menunjukkan bahwa semakin bermakna Anda dapat membandingkan kata sandi yang sama, semakin tidak aman hashing Anda.
Pentingnya Hashing Yang Kuat
Basis data dengan kata sandi dicuri secara teratur, dengan pembobolan besar dalam berita setiap bulan. Heck, baru bulan lalu keadaan SC kehilangan nomor jaminan sosial semua orang - ya! Berapa banyak lagi pelanggaran ini yang ditutup-tutupi?
Pikiran Penutup
Hal yang paling menakutkan bagi saya adalah ketika orang memilih kata sandi yang sama atau mirip untuk beberapa situs sehingga membobolnya memberikan penyerang akses ke semuanya. Saya ingin melihat metode yang terbukti mencegah situasi itu, meskipun saya pikir mencegah kata sandi buruk yang paling umum akan membantu lebih dari mencegah seorang pengguna menggunakan kembali kata sandi buruk mereka di situs yang sama. Yang terbaik yang bisa saya sarankan adalah kebijakan di seluruh perusahaan untuk menggunakan pengelola kata sandi aman yang menghasilkan kata sandi sangat acak untuk setiap pengguna Anda dan menyimpannya dengan aman.
sumber
Pertama, Anda bisa menyimpan hash untuk kata sandi "n" terakhir, jadi Anda dapat memeriksa apakah kata sandi baru mereka menggandakan kata sandi sebelumnya. Anda juga memiliki teks biasa kata sandi mereka saat ini (karena mereka telah login atau memberikannya kepada Anda untuk mengotentikasi permintaan perubahan kata sandi mereka), dan kata sandi baru mereka, sehingga Anda dapat memeriksa perubahan minimal antara kedua kata sandi ini.
Jika (untuk Anda) sangat penting untuk membandingkan secara langsung kedua kata sandi ini dengan kata sandi "n" sebelumnya, maka Anda harus menyimpan kata sandi ini (dienkripsi) untuk dapat mengambilnya nanti.
Sementara itu dapat dilihat sebagai cacat keamanan untuk melakukan ini, metode enkripsi dapat diimplementasikan untuk memberikan keamanan yang memadai.
Kemudian, kapan pun kata sandi diubah, Anda dapat membatalkan enkripsi semua kata sandi lama, dan melakukan semua tes perubahan minimal.
Sekarang, jika seseorang memiliki kata sandi orang ini, dan mengetahui semua perincian lainnya yang diperlukan, mereka dapat membatalkan enkripsi informasi ini untuk orang ini. Tetapi jika mereka sudah memiliki kata sandi orang ini, mereka sudah bisa masuk sebagai orang ini dan mengakses akun orang ini.
Juga, untuk kata sandi lama, kata sandi tersebut mungkin tidak harus disimpan dalam teks biasa. Mereka dapat disimpan dalam beberapa cara yang dikaburkan. Atau disimpan sebagai daftar karakter alfabet dalam kata sandi.
Saya tidak mengatakan ini adalah hal yang direkomendasikan untuk dilakukan dalam kasus umum, tetapi dengan asumsi tugas yang telah Anda jelaskan diperlukan dalam kasus Anda, maka ini adalah salah satu cara untuk menyelesaikannya dengan beberapa langkah keamanan.
sumber