Du snubblade över det största problemet med att kryptera data i databasen:
➽ Var ska nyckeln förvaras?
Kryptering kan inte lösa problemet med att säkra data, den kan bara "koncentrera" den till en nyckel. Var du än lagrar nyckeln måste din applikation kunna dekryptera data, det kan även en angripare göra. Det finns två möjliga lösningar på detta problem jag känner till:
- Placera nyckeln på ett så säkert ställe du kan. Det betyder att den säkert bör placeras utanför www-rootkatalogen i en otillgänglig katalog på servern. Beroende på vikten av data kan du även överväga att lägga ut kryptering till en annan dedikerad server.
- Lagra inte en nyckel alls och härled den från användarlösenordet. Detta är det enda riktigt säkra sättet, eftersom inte ens servern kan dekryptera datan då. Nackdelarna är naturligtvis att användaren måste ange lösenordet varje gång han använder din tjänst. Om användaren ändrar lösenordet måste du kryptera om all data. Om användaren glömmer lösenordet går data förlorad.
P.S. Jag skulle rekommendera att kryptera data före lagrar den i databasen, eftersom MySQL AES_ENCRYPT använder ECB-läget utan en IV. Detta gör det möjligt att söka efter ett visst värde, men det är mindre säkert (jag är ganska säker på att du inte vill söka med lösenord).