Problema
Estoy tratando de explicar el escenario completo en los siguientes párrafos. Creo que esto es importante para obtener algún contexto en el que se formule la pregunta, así que, por favor, tengan paciencia, incluso si es un muro de texto.
Actualmente tengo la tarea de anonimizar los datos de forma segura. La idea es usar HMAC(<string to anonymize>, key)
para anonimizar los datos para que no se puedan revertir. Por ejemplo, si tiene un ID de cliente ( CUST299128218
) esto sería HMAC-ed usando SECRET
como la clave para 543a36dd07fe4a3fa4a2db202546eaaccaef71f871ebafe11de3b54784ba266e
. Dado que queremos realizar un análisis sobre los datos anónimos, es importante que la misma ID de cliente siempre genere el mismo resumen HMAC. Entonces no podemos desechar la clave secreta , ya que necesitamos anonimizar los datos futuros con la misma clave.
Obviamente, la clave debe almacenarse en un lugar seguro para que no salga. De lo contrario, alguien que conozca un ID de cliente podría encontrar fácilmente a ese cliente específico en los datos anónimos. Por diversos motivos técnicos / organizativos, no podemos utilizar un módulo de seguridad de hardware para almacenar la clave. Así que eché un vistazo a la Bóveda de HashiCorp, que parece ser un buen ajuste para esto, ya que proporciona una API REST donde puede asignarle un texto plano y devuelve el HMAC de este texto simple utilizando un archivo almacenado previamente. llave. La clave nunca abandona la Bóveda, que es mucho mejor que tener la clave almacenada en alguna propiedad de configuración del software de anonimización.
Sin embargo, estamos hablando de grandes cantidades de conjuntos de datos para ser anonimizados (unos pocos cientos de miles hasta unos pocos millones por día) y es previsible que se llame la API de Vault para cada conjunto de datos (posiblemente varias veces, si es necesario anonimizar varios elementos, se producirá una carga general que puede sobrecargar la infraestructura que tenemos disponible para esto.
Solución propuesta
Por lo tanto, tuve esta idea: ¿Qué pasaría si usara una cadena fija (por ejemplo, 'customer_id_secret_bootstrap'
) y permitiera que Vault cree un HMAC al usar la clave secreta? Luego uso este HMAC como clave secreta para el HMAC real en los datos para anonimizar. En términos funcionales:
temp_key = CALL_VAULT('customer_id_secret_bootstrap')
anonymized_text = HMAC( <plaintext>, temp_key)
De esta manera solo pude hacer una llamada a Vault y mantener la clave temporal en la memoria. Siempre debo recuperar la misma clave temporal de Vault (ya que es un HMAC), pero la clave original (que se usa para derivar la clave temporal) nunca abandona la bóveda y cuando el programa sale, la clave temporal no se puede volver a crear. sin acceder a la bóveda. De esta manera, garantizaría la seguridad de la clave sin tener un millón de llamadas a la Bóveda.
Pregunta
Ahora, sabiendo que no soy un experto en seguridad, esta puede ser una idea terrible por razones desconocidas para mí. Por lo tanto, me gustaría compartir esto con sus expertos aquí. ¿Puede decirme si es una buena o mala idea y si es una mala idea? ¿Podría sugerir algún enfoque alternativo que garantice la seguridad de la clave y sea escalable?
Actualizar / Editar
Como indican muchas respuestas, no es suficiente para simplemente reemplazar las ID, ya que hay otros campos que se pueden usar para correlacionar la información con un pequeño conjunto de personas o incluso con una sola persona (por ejemplo, las marcas de tiempo son excelentes para esto). También nos encargamos de esto eliminando o reemplazando dicha información para asegurarnos de que esto no pueda suceder (tenemos una lista de verificación muy larga con respecto a estas cosas, que se basa en estándares de anonimización). Simplemente no quería introducir esos detalles aquí, ya que la pregunta ya es muy larga.