Jag vet inte om det är mycket meningsfullt att kryptera data med användarens lösenordshash, särskilt om du behåller hashen i databasen. I så fall kan alla som kan komma åt den krypterade informationen också komma åt lösenords-hashen och dekryptera datan.
Ett annat tillvägagångssätt skulle vara att kryptera data med den applikationsspecifika nyckeln saltad med vissa användarspecifika data. Men då står du inför ett annat problem:hur man säkert lagrar applikationsnyckeln. På den frågan vet jag inget enkelt svar, men att behålla den i din källkod räcker nog om du befarar att din databasdata kan äventyras, men inte själva källkoden, t.ex. om din databas lagras utanför webbplatsen (tänk Amazon S3).
Att salta appnyckeln med användarens lösenord hjälper om du bara behåller lösenordets hash i databasen, men kan introducera ytterligare ett säkerhetsbrist:du måste behålla användarens lösenord i klartext i applikationssessionen.
När det gäller teknisk lösning är den ganska enkel och exempelkod är tillgänglig . Du kan ändra det enligt följande för att kryptera data med applikationslösenordet saltat med lösenordshash:
INSERT INTO secure_table VALUES (
1,
AES_ENCRYPT(
'plain text data',
CONCAT(@application_password, @user_password))
);
I vilket fall som helst måste du lagra ditt applikationslösenord någonstans så jag tror inte att det finns ett enkelt tillvägagångssätt som ger perfekt säkerhet.
En annan metod jag kan tänka mig är att be användaren om en kort PIN-kod som du kan använda som en krypteringsnyckel. PIN-koden skulle inte lagras i databasen, men du skulle behöva be användaren om det varje gång du kommer åt deras data.
Och naturligtvis måste du tänka på är krypteringens genomförbarhet. Du kommer inte att kunna indexera eller söka i den utan dekryptering. Det krävs förmodligen för en begränsad uppsättning data (t.ex. kreditkortsnummer), men jag skulle inte gå så långt med det.