Natknąłeś się na największy problem z szyfrowaniem danych w bazie danych:
➽ Gdzie przechowywać klucz?
Szyfrowanie nie może rozwiązać problemu zabezpieczenia danych, może jedynie „skoncentrować” je na kluczu. Gdziekolwiek przechowujesz klucz, Twoja aplikacja musi być w stanie odszyfrować dane, więc może to zrobić napastnik. Znam dwa możliwe rozwiązania tego problemu:
- Umieść klucz w jak najbezpieczniejszym miejscu. Oznacza to, że z pewnością powinien być umieszczony poza katalogiem www-root w niedostępnym katalogu na serwerze. W zależności od wagi danych, możesz również rozważyć outsourcing szyfrowania na inny serwer dedykowany.
- Nie przechowuj w ogóle klucza i czerp go z hasła użytkownika. To jedyny naprawdę bezpieczny sposób, ponieważ nawet serwer nie może wtedy odszyfrować danych. Wadą jest oczywiście to, że użytkownik musi wpisywać hasło za każdym razem, gdy korzysta z Twojej usługi. Jeśli użytkownik zmieni hasło, musisz ponownie zaszyfrować wszystkie dane. Jeśli użytkownik zapomni hasła, dane zostaną utracone.
PS Zalecam zaszyfrowanie danych przed przechowywanie go w bazie danych, ponieważ MySQL AES_ENCRYPT używa trybu ECB bez IV. Pozwala to na wyszukiwanie określonej wartości, ale jest mniej bezpieczne (jestem prawie pewien, że nie chcesz wyszukiwać według hasła).