NB: originalmente publiqué esto en SO ( link ), pero luego se da cuenta de que Security SE es más adecuado, ya que hay preguntas alrededor de Crypto-PAn, que es similar aquí
Tengo un archivo de registro de las consultas de la base de datos que me gustaría anonimizar. Estas se obtienen de los clientes y luego se analizan externamente. A los clientes les gustaría anonimizar estos datos lo suficiente como para proteger la información de identificación, pero aún así lo suficiente para permitir un análisis útil.
Algunas líneas pueden contener direcciones IP (por ejemplo, IP de origen). Creo que puedo usar algo como Crypto -Papá para anonimizar esos. Tengo entendido que este anonimato es inyectivo (1: 1) y repetible, pero también no reversible.
Del mismo modo, las líneas también pueden contener campos y valores, por ejemplo, { "name.first": "John" }
.
Para los valores, me complace usar simplemente MD5 directo (o similar en el contenido), no es tan crítico que veamos lo que son.
Sin embargo, para los campos de la base de datos, nos gustaría preservarlos en un formato un tanto legible para las personas. Esto se debe a que haríamos un análisis de rendimiento basado en esos campos (por ejemplo, agrupando consultas por campos, etc.)
Por ejemplo, name.first
podría convertirse en Tree.Blackboard
.
Las restricciones son:
- Cada palabra de entrada debe asignarse a un hash, y viceversa (entiendo que habrá algunas colisiones, pero espero que sean lo suficientemente raras).
- Repetible: si tenemos varios archivos de registro, queremos que se genere el mismo hash cada vez, esto nos permitirá comparar los archivos de registro.
- No reversible: idealmente, no debería haber una manera fácil de revertir el hash para obtener el nombre del campo original.
- Legible para humanos: el hash debe ser legible / pronunciable por humanos, pero no necesariamente tienen que ser palabras en inglés válidas (por ejemplo,
Flerti
es aceptable,037751d79d1ebfdd0664b2c66b8d66d1
no lo es)
Lo discutí con un colega, y una de las maneras que pensamos fue:
- Tome el nombre del campo y páselo a través de un hash unidireccional estándar (por ejemplo, MD5).
- Tome suficientes bits de orden inferior del hash resultante para asignarlos a un diccionario de palabras en inglés (por ejemplo, 1,000,000 de palabras válidas). Use el equivalente entero de esos bits y haga un mod para indexar una palabra en ese diccionario.
La idea es que: las palabras serían legibles y, al mismo tiempo, siempre consistentes (suponiendo que su diccionario permanezca igual).
Si algunas personas estaban preocupadas por los ataques de diccionario (es decir, el nombre de campo "nombre" siempre se asignaría para decir "Pizarra"), entonces esa persona podría tener su propio archivo de clave específico para eliminar el hash. Esto significa que sería repetible para ellos los archivos de registro anónimos (es decir, que "primer nombre" siempre se asignaría a "Billion" para ellos), pero no sería lo mismo que para otras personas que usan otros archivos de claves.
Pregunta 1 : ¿ya existe un algoritmo criptográfico (similar a Crypto-PAn) que se pueda usar para anonimizar cadenas de una manera pronunciable / legible?
Pregunta 2 : si no, ¿ve algún agujero deslumbrante en el enfoque simplista descrito anteriormente?