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 recuperarlos en un formato legible, pero, y aquí está el truco, fuera de la fuente de nuestro código PHP. Es decir, si alguien alguna vez viola nuestros servidores y recupera nuestro código fuente, las contraseñas de nuestra base de datos y todo lo que tenga que ver con nuestra inteligencia comercial, nos gustaría que aún tuviera datos completamente inútiles sin el algoritmo de cifrado.
¿Qué? sería la mejor manera de hacerlo, y ¿existen soluciones listas para usar? Estábamos pensando en algo parecido a un módulo php o apache, o incluso un pequeño programa Go: cualquier cosa compilada que se ejecute muy rápido y que no se pueda utilizar si se la roban debido a su naturaleza compilada.
Lo que queremos es algo como esto:
Los correos electrónicos en la base de datos se almacenarían en este formato
gibbweswwvsknvknsdvasadjfoaisjdoiasjdoiasjskdjfajsfoiajsdoijwhatever
Entonces, cuando lo hicimos esto:
$ email = $ db -> getEmailById (30); $ email = decrypt ($ email);
la función de descifrado descifrado real, pero fuera de php. Podría llamar al comando del sistema y ejecutar un archivo binario, lo que sea. Pero lo que devuelva decrpyt es el correo electrónico utilizable real.
Este correo electrónico descifrado se puede usar como el 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 el usuario corta la base de datos de alguna manera, todo lo que ve es el galimatías anterior.
Editar: tdammers preguntó por qué esto tiene que estar fuera de PHP pero invocable desde dentro de PHP. Porque utilizamos los valores reales de las direcciones de correo electrónico un par de miles de veces por minuto, además de diferentes. Por lo tanto, nuestra aplicación web necesita acceso rápido a los valores legibles en todo momento, pero debemos estar seguros de que si alguien toma nuestro código fuente de alguna manera o la base de datos en sí, no tendrá valores utilizables. Puede ser cualquier persona, desde un pirata informático hasta una parte del código expuesta 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.