Du faldt over det største problem med at kryptere data i databasen:
➽ Hvor skal nøglen opbevares?
Kryptering kan ikke løse problemet med at sikre data, den kan kun "koncentrere" dem til en nøgle. Uanset hvor du gemmer nøglen, skal din applikation være i stand til at dekryptere dataene, det samme kan en angriber. Der er to mulige løsninger på dette problem, jeg kender til:
- Placer nøglen på et sted så sikkert som muligt. Det betyder, at det helt sikkert skal placeres uden for www-rodmappen i en utilgængelig mappe på serveren. Afhængigt af vigtigheden af dataene, kan du også overveje at outsource kryptering til en anden dedikeret server.
- Opbevar slet ikke en nøgle og udled den fra brugeradgangskoden. Dette er den eneste virkelig sikre måde, for ikke engang serveren kan dekryptere dataene dengang. Ulemperne er selvfølgelig, at brugeren skal indtaste adgangskoden hver gang han bruger din tjeneste. Hvis brugeren ændrer adgangskoden, skal du genkryptere alle data. Hvis brugeren glemmer adgangskoden, går dataene tabt.
P.S. Jeg vil anbefale at kryptere dataene før gemmer det i databasen, fordi MySQL AES_ENCRYPT bruger ECB-tilstand uden en IV. Dette gør det muligt at søge efter en bestemt værdi, men det er mindre sikkert (jeg er ret sikker på, at du ikke vil søge efter adgangskode).