Натъкнахте се на най-големия проблем с криптирането на данни в базата данни:
➽ Къде да съхранявате ключа?
Шифроването не може да реши проблема със защитата на данните, може само да ги "концентрира" в ключ. Където и да съхранявате ключа, вашето приложение трябва да може да декриптира данните, така че може да направи и нападател. Има две възможни решения на този проблем, за които знам:
- Поставете ключа на възможно най-безопасно място. Това означава, че със сигурност трябва да бъде поставен извън директорията www-root в недостъпна директория на сървъра. В зависимост от важността на данните, можете също да помислите за възлагане на криптиране на друг специален сървър.
- Изобщо не съхранявайте ключ и го извличайте от потребителската парола. Това е единственият наистина безопасен начин, защото дори сървърът не може да декриптира данните тогава. Недостатъците, разбира се, са, че потребителят трябва да въвежда паролата всеки път, когато използва вашата услуга. Ако потребителят промени паролата, трябва да шифровате отново всички данни. Ако потребителят забрави паролата, данните се губят.
P.S. Бих препоръчал да шифровате данните преди съхранявайки го в базата данни, тъй като MySQL AES_ENCRYPT използва режима на ECB без IV. Това позволява търсене на определена стойност, но е по-малко сигурно (сигурен съм, че не искате да търсите по парола).