Almacenamos las direcciones de correo electrónico de los usuarios en nuestra base de datos, como muchos otros sitios web. Si bien nos enorgullecemos de las medidas de seguridad implementadas, a veces "solo lo suficiente" no es suficiente.
Hemos comenzado a buscar una solución que nos permita almacenar las direcciones de correo electrónico en un formato cifrado y recuperarlas en un formato legible, pero, y aquí está el problema, fuera de la fuente de nuestro código PHP. Es decir, si alguien alguna vez infringe nuestros servidores y recupera nuestro código fuente, las contraseñas de nuestra base de datos y todo lo relacionado con nuestra inteligencia comercial, nos gustaría que aún tuviera datos absolutamente inútiles sin el algoritmo de cifrado.
¿Cuál sería la mejor manera de hacer esto y hay soluciones ya hechas? Estábamos pensando en algo parecido a un módulo php o apache, o incluso un pequeño programa Go: cualquier compilación que se ejecutaría muy rápido y sería inutilizable si se la robara debido a su naturaleza compilada.
Lo que queremos es algo como esto:
Los correos electrónicos en la base de datos se almacenarán en este formato
gibbweswwvsknvknsdva
sadjfoaisjdoiasjdoiasj
skdjfajsfoiajsdoij
whatever
Entonces, cuando hicimos esto:
$email = $db -> getEmailById(30);
$email = decrypt($email);
la función de descifrado sería para el descifrado real, pero fuera de php. Podría llamar al comando del sistema y ejecutar un archivo binario, lo que sea. Pero cualquier devolución de datos es el correo electrónico utilizable real.
Este correo electrónico descifrado se puede usar como destinatario de un correo electrónico enviado por el sistema, o como información de contacto mostrada en el perfil de un usuario, etc., pero si el usuario rompe el DB de alguna manera, todo lo que ve es el gibberish anterior.
Editar: tdammers preguntó por qué esto tiene que estar fuera de PHP pero puede llamarse desde PHP. Debido a que utilizamos los valores reales de las direcciones de correo electrónico un par de veces por minuto, diferentes. Por lo tanto, nuestra aplicación web necesita un acceso rápido a los valores legibles en todo momento, pero tenemos que estar seguros de que si alguien toma nuestro código fuente de alguna manera o de la base de datos en sí, no tendrá valores utilizables. Puede ser cualquiera, desde un pirata informático, a una parte del código que se expone debido a un error crítico, o un ex empleado descontento 5 minutos después de ser despedido, lo que nos deja sin tiempo para revocar su acceso.