Me gustaría cifrar las direcciones IP en mi base de datos MySQL, con las siguientes restricciones:
- No necesita ser resistente a los atacantes que pueden ejecutar consultas.
- Debe ser resistente a los atacantes que tienen acceso a los archivos en el disco.
- Debe poder validar una IP contra el formulario encriptado, para verificar si coincide.
- También sería útil verificar con
/24
comodines (por ejemplo,10.20.30.*
). - No se puede ingresar ninguna forma de clave o contraseña en el inicio del sistema, ya que se ejecutará en un servidor en un centro de datos, e iniciar sesión a través de SSH cada reinicio es un dolor que puedo prescindir.
Actualmente estoy usando conexiones de base de datos separadas para ofrecer mejores restricciones de privilegios, con una tabla separada para las contraseñas. También estoy usando MySQLi y revisiones de código semiautomatizadas para garantizar que no haya agujeros de inyección SQL.
Con un mecanismo hash sin salado (es decir, determinístico), sería fácil calcular todos los hashes IP posibles. Con un hash salado, ese problema se reduce, pero aún así no es mucho mejor si un atacante solo intenta romper un hash de IP. Por supuesto, todo esto también evita las búsquedas con comodines.
¿Hay una solución para esto?
Actualización:
Después de pensarlo, he encontrado el siguiente esquema:
- La aplicación web tiene una clave pública RSA de 4096 bits incorporada en la fuente, mantengo la clave privada en un volumen TrueCrypt en mi máquina doméstica.
- Al insertar entradas en la tabla de registros, la IP se rellena con una cadena aleatoria y se cifra con la clave pública. Esto hace que descifrarlo sea imposible y hace que el cifrado no sea determinista.
- La aplicación web proporciona una API para exportar los registros, a los que solo pueden acceder mediante SSL los usuarios autenticados.
- Escribo una aplicación para usar la API para navegar por los registros de mi equipo doméstico, usar la clave privada para descifrar las direcciones IP.
- Cuando una dirección IP está prohibida, la IP se almacena en texto sin formato en la tabla de prohibiciones.
¿Algún comentario o sugerencia?