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:
- Jika penyerang tidak mengetahui kunci pengguna sebenarnya, atau jika ia menginginkan akses lebih dari sekadar data pengguna sebenarnya, ia dapat mencoba kredibilitas masuk log kasar untuk pengguna asli atau akun lain. (Secara teori, Anda dapat mengunci setiap akun ke IP klien jarak jauh tertentu, yang juga akan membantu membagi risiko-risikonya.)
- Jika penyerang memang mendapatkan kunci yang valid untuk pengguna sebenarnya, ia memiliki jalan melewati layar masuk (yang mungkin cukup sederhana untuk diamankan), ke perut lembut kode aplikasi yang berpotensi buggy. Injeksi SQL yang berhasil dari konteks pengguna nyata dapat memberinya akses ke data klien lain juga.
Sekarang, mari kita bicara tentang bagaimana enkripsi sisi server berlaku untuk situasi ini:
- Enkripsi sisi server pasti membantu melawan ancaman injeksi SQL. Jika nilai baris dienkripsi dalam tabel DB, penyerang hanya bisa melihat ciphertext omong kosong dari data milik akun lain. Ancaman terkandung, terkotak.
- Namun, memaksa dengan kasar menebak kata sandi, tidak benar-benar menjadi lebih sulit bagi penyerang yang menghadapi enkripsi sisi server. Terlepas dari apakah kunci pengguna disimpan di server atau dihasilkan di tempat dari kata sandi, satu-satunya hal yang penting adalah apakah Anda memiliki kata sandi yang tepat. Server memutuskan untuk membiarkan Anda menggunakan kunci tersimpan yang valid karena memeriksa apakah kata sandi Anda benar, atau menghitung kunci yang valid untuk Anda karena kata sandi Anda adalah input yang benar untuk menghasilkan kunci itu.
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:
- Melewati kuncinya ke server jauh lebih mudah untuk dikodekan dan dikelola, dan biasanya jauh lebih cepat karena kode kripto yang lebih optimal (dikompilasi C, mungkin).
- Pendekatan sisi klien murni memberikan keamanan ekstra, karena bahkan jika penyerang mendapatkan root di server, ia masih tidak dapat membaca data yang dienkripsi, dan ia tidak akan pernah bisa membacanya. Satu-satunya vektor serangan yang mungkin adalah kompromi workstation klien jarak jauh.
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.