Не знам дали има много смисъл от криптиране на данни с хеш на паролата на потребителя, особено ако държите самия хеш в базата данни. В този случай всеки, който има достъп до криптираните данни, може също да получи достъп до хеша на паролата и да декриптира данните.
Друг подход би бил да се криптират данните със специфичния за приложението ключ, подсолен с някои специфични за потребителя данни. Тогава обаче се сблъсквате с друг проблем:как да съхранявате сигурно ключа на приложението. На този въпрос не знам лесен отговор, но запазването му във вашия изходен код вероятно е достатъчно добро, ако се страхувате, че данните от вашата база данни могат да бъдат компрометирани, но не и самият изходен код, напр. ако вашата база данни се съхранява извън сайта (помислете за Amazon S3).
Посоляването на ключа на приложението с паролата на потребителя помага, ако съхранявате само хеша на паролата в базата данни, но може да доведе до друг недостатък в сигурността:трябва да запазите паролата на потребителя в ясен текст в сесията на приложенията.
Що се отнася до техническото решение, то е доста просто и наличен е примерен код . Можете да го модифицирате по следния начин, за да шифровате данните с паролата за приложение, подкрепена с хеш на паролата:
INSERT INTO secure_table VALUES (
1,
AES_ENCRYPT(
'plain text data',
CONCAT(@application_password, @user_password))
);
Във всеки случай ще трябва да съхраните паролата си за приложение някъде, така че не мисля, че има лесен подход, който осигурява перфектна сигурност.
Друг подход, за който се сещам, е да поискам от потребителя кратък ПИН, който можете да използвате като ключ за криптиране. ПИН кодът няма да бъде съхранен в базата данни, но ще трябва да питате потребителя за това всеки път, когато осъществявате достъп до неговите данни.
И разбира се, трябва да помислите за осъществимостта на криптирането. Няма да можете да индексирате или да го търсите без декриптиране. Вероятно се изисква за ограничен набор от данни (напр. номер на кредитна карта), но не бих стигнал далеч с него.