(Catatan:Saya bukan ahli keamanan. Saya tertarik dengan area ini, tapi hanya itu. Ingatlah itu.)
Jika memungkinkan, jangan simpan sandi sama sekali
Itu sangat tergantung pada apa kebutuhan Anda. Pilihan terbaik dari semuanya adalah tidak menggunakan enkripsi dua arah sama sekali; jika Anda hanya dapat menyimpan salted dan hash satu arah intisari kata sandi itu ideal. Anda masih dapat mengujinya untuk melihat apakah mereka cocok dengan sandi yang diberikan dari pengguna, tetapi Anda tidak pernah menyimpannya.
Lebih baik lagi, jika klien Anda menggunakan beberapa protokol yang waras (yaitu:bukan HTTP seperti yang biasa diterapkan), Anda dapat menggunakan mekanisme autentikasi tantangan-respons itu berarti aplikasi Anda tidak pernah pernah perlu melihat kata sandi pengguna, bahkan saat mengautentikasinya. Sayangnya, hal ini jarang dapat dilakukan di web publik, yang memiliki keamanan yang akan mempermalukan programmer tahun 80-an.
Jika Anda harus menyimpan sandi, pisahkan kunci dari aplikasi
Jika Anda harus dapat mendekripsi kata sandi, idealnya Anda tidak memiliki semua detail untuk melakukannya di satu tempat, dan tentu saja tidak di satu tempat yang dapat disalin dan mudah diakses.
Untuk alasan itu saya pribadi lebih suka untuk tidak menggunakan PgCrypto (seperti yang Anda lakukan) untuk tujuan ini karena itu memaksa Anda untuk mengungkapkan kunci pribadi dan (jika ada) frasa sandi ke server, di mana ia dapat diekspos di PostgreSQL's file log atau berpotensi mengendus. Saya ingin melakukan sisi klien kripto saya, di mana saya dapat menggunakan PKCS#11, agen kunci, atau alat lain yang memungkinkan saya mendekripsi data tanpa kode saya dapat mengakses kunci.
Masalah penyimpanan kunci yang aman adalah bagian dari PKCS#11 diciptakan untuk. Ini menyediakan antarmuka umum untuk aplikasi dan penyedia kripto untuk berbicara dengan apa pun yang dapat menyediakan layanan penandatanganan dan dekripsi tertentu tanpa pernah mengungkapkan kuncinya . Penggunaan yang biasa, tetapi tidak hanya, adalah dengan kripto berbasis perangkat keras seperti kartu pintar dan modul kripto perangkat keras. Perangkat tersebut dapat diminta untuk menandatangani atau mendekripsi data yang dikirimkan kepada mereka, dan dapat melakukannya tanpa pernah mengungkapkan kuncinya. Jika memungkinkan, pertimbangkan untuk menggunakan kartu pintar atau HSM. Sejauh yang saya tahu, PgCrypto tidak dapat menggunakan PKCS#11 atau HSM/kartu pintar lainnya.
Jika Anda tidak dapat melakukannya, Anda mungkin masih dapat menggunakan agen manajemen kunci, di mana Anda memuat kunci Anda ke dalam program manajemen kunci secara manual saat server melakukan booting, dan program manajemen kunci menyediakan antarmuka PKCS#11 (atau lainnya) untuk penandatanganan dan dekripsi melalui soket. Dengan begitu, aplikasi web Anda tidak perlu mengetahui kuncinya sama sekali. gpg-agent
mungkin memenuhi syarat untuk tujuan ini. Sekali lagi, sejauh yang saya tahu PgCrypto tidak dapat menggunakan agen manajemen kunci, meskipun itu akan menjadi fitur yang bagus untuk ditambahkan.
Bahkan perbaikan kecil dapat membantu. Yang terbaik adalah jika frasa sandi untuk kunci Anda tidak disimpan di disk, jadi Anda mungkin perlu memasukkannya saat aplikasi dijalankan sehingga kunci dapat didekripsi. Anda masih menyimpan kunci yang didekripsi di memori, tetapi semua detail untuk mendekripsi tidak lagi ada di disk dan mudah didapat. Jauh lebih sulit bagi penyerang untuk mencuri kunci yang didekripsi dari memori daripada mengambil "password.txt" dari disk.
Apa yang Anda pilih untuk dilakukan sangat bergantung pada detail kebutuhan keamanan Anda dan data yang sedang Anda kerjakan. Di posisi Anda, saya tidak akan menyimpan kata sandi jika memungkinkan, dan jika harus, saya ingin menggunakan perangkat keras yang kompatibel dengan PKCS#11.