Saya sedang mengembangkan sistem intranet lokal dalam PHP / MySQL untuk mengelola data klien kami. Tampaknya praktik terbaik adalah mengenkripsi data sensitif pada server MySQL ketika sedang dimasukkan.
Saya tidak jelas, bagaimanapun, tentang apa yang akan menjadi cara terbaik untuk melakukan ini sementara masih memiliki data yang mudah diakses.
Sepertinya pertanyaan sulit untuk dijawab: di mana kunci disimpan? Bagaimana cara terbaik melindungi kunci? Jika kunci disimpan di mesin masing-masing pengguna, bagaimana cara melindunginya jika mesin dieksploitasi? Jika kunci dieksploitasi, bagaimana cara mengubah kunci?
Jika kuncinya akan disimpan dalam DB, bagaimana cara melindunginya di sana? Bagaimana pengguna mengaksesnya?
mysql
encryption
stormdrain
sumber
sumber
Jawaban:
Sebenarnya tidak ada fitur bawaan MySQL untuk menangani pengaturan kunci terenkripsi yang canggih. Anda harus mengimplementasikan sebagian besar logika enkripsi dalam kode PHP dan / atau sisi browser (javascript?) Anda sendiri.
Tetapi kekhawatiran yang Anda nyatakan agak aneh: Sepertinya satu-satunya kekhawatiran Anda yang sebenarnya adalah injeksi SQL atau brute force (menebak-nebak, saya berasumsi) serangan dari desktop klien / workstation laptop. Itu membuat saya curiga bahwa Anda sudah merencanakan tindakan keamanan lain yang tidak disebutkan, dan Anda telah menganalisis kemungkinan jalan kompromi.
Pertama, saya berasumsi Anda memiliki aturan firewall yang melindungi host MySQL / PHP terhadap segala jenis akses dari IP klien jarak jauh yang tidak disetujui. Jika saya benar, masuk akal bahwa Anda hanya khawatir tentang serangan dari workstation pengguna yang dikompromikan.
Juga, saya berasumsi Anda mengerti bahwa jika penyerang pada host klien jarak jauh dapat meningkat ke root / Admin privs, atau secara langsung membahayakan akun pengguna sebenarnya, maka data klien tidak memiliki perlindungan apa pun terlepas dari enkripsi atau perlindungan lainnya. (Penyerang dapat membaca kunci dari mana saja mereka disimpan pada disk, atau mengintai mereka ketika pengguna yang sebenarnya memasukkan mereka saat masuk, dan kunci mengarah ke data.)
Mulai dari dua asumsi tersebut, masuk akal bagi kami untuk menyimpulkan bahwa hanya dua ancaman yang relevan adalah A) menebak dengan kasar, dan B) upaya injeksi SQL:
Sekarang, mari kita bicara tentang bagaimana enkripsi sisi server berlaku untuk situasi ini:
Enkripsi sisi klien, di sisi lain, sebenarnya membuat serangan kata sandi brute force tidak relevan. Anda tidak dapat dengan kasar memaksa kunci yang dibangun dengan benar. Enkripsi sisi klien pada dasarnya menjaga tingkat perlindungan yang sama terhadap injeksi SQL seperti halnya enkripsi sisi server. Klien dapat meneruskan kunci ke server saat masuk, menyimpan salinan di memori sampai sesi selesai, yang menempatkan beban CPU crypto di server. Atau, klien dapat menangani enkripsi / dekripsi dengan sendirinya, di browser. Ada dua pasang surut dari kedua teknik ini:
Akhirnya, saya akan mencatat bahwa ada beberapa kerugian operasional besar untuk mengenkripsi data dalam database. Karena representasi data terenkripsi pada dasarnya adalah pola acak, fitur basis data dasar seperti pengindeksan, bergabung, dll tidak akan berfungsi. Klien mengambil beban logika yang sangat besar, dan mungkin kehilangan banyak manfaat yang biasanya dimiliki oleh fitur basis data.
sumber
Anda mungkin ingin melihat ezNcrypt , yang menggunakan ecryptfs, kontrol akses, dan manajemen kunci untuk memberikan keamanan dan kinerja tinggi untuk enkripsi Linux dari database MySQL dan proses lainnya. Tidak, saya tidak bekerja untuk mereka.
sumber
Anda bisa menggunakan Scytale. Ini adalah proxy kripto NoSQL untuk DBMS dan aplikasi web modern. Mendukung enkripsi multi-penerima dan grup. Dipenuhi dengan cryptosystem RSA / AES yang kuat. Ini juga 100% gratis dan open-source.
https://bitbucket.org/maximelabelle/scytale
sumber