Solución segura para la generación única de PIN para clientes externos

1

Estoy evaluando los requisitos para entregar un diseño de aplicación seguro en un sistema de administración de PIN. El contexto detrás de la necesidad es que los PIN se generan y se envían de forma segura a los clientes para fines de autenticación a través de un sistema de telefonía telefónica. El sistema de telefonía cuando se le presente una identificación de cuenta y un PIN llamará al sistema de administración de PIN para la autenticación del cliente.

A todos los efectos, he establecido que se deben seguir las mejores prácticas en un servicio de autenticación. Los PIN deben estar protegidos y ser confidenciales según cómo se podrían proteger las contraseñas en un sistema. Sin embargo, mi pregunta tiene que ver con la mejor manera de manejar la generación de un PIN.

Los clientes no tienen la capacidad de decidir sobre su propio PIN. El sistema debe generar un PIN para el cliente, luego pasarlo a una máquina de correo de seguridad que lo imprima dentro de un sobre de privacidad auto sellado. El PIN no caduca, pero puede ser revocado por un administrador. El cliente puede solicitar un nuevo PIN por cualquier motivo que invalide su PIN actual. El PIN es de 8 caracteres alfanuméricos.

El requisito del cual no estoy seguro es que la empresa insista en que todos los PIN deben ser únicos. No hay dos clientes que deban recibir accidentalmente el mismo PIN. En la superficie, esto parece ser un requisito relativamente benigno hasta que comienzo a considerar cómo el sistema podría verificar la singularidad de un PIN a escala global. Pienso que si es una práctica recomendada incluir el PIN con datos que son específicos de cada registro, y luego obtener el resultado, almacenaríamos un PIN criptográficamente único que no se puede revertir y es resistente al ataque de la tabla del arco iris. Sin embargo, para mantener un registro de todos los PIN únicos que ya se han generado, necesitaría mantener un hash separado de estos en otra ubicación, pero se sentó globalmente para poder verificar si un PIN recién generado tenía La probabilidad ya ha sido generada.

Creo que el solo hecho de mantener una lista de PIN con hash que se han generado históricamente representa una gran responsabilidad de seguridad para el sistema, posiblemente más riesgosa que la posibilidad de que cualquiera de los dos clientes tenga el mismo PIN.

Estoy teniendo problemas para entender no solo por qué la empresa se muestra inflexible al respecto, si es solo porque un sistema heredado similar funciona de esta manera, o si existe alguna razón regulatoria por la que debe ser así. También estoy teniendo problemas para entender cómo puedo implementar una solución de este tipo de forma segura sin crear una vulnerabilidad. ¿Alguna sugerencia sobre cómo o si esto se puede lograr de manera segura?

ACTUALIZACIÓN: información adicional, esta es una cantidad relativamente pequeña de clientes, quizás menos de 20k. Si uno fuera a determinar qué era la sal global al mirar el código, entonces una tabla de arco iris podría determinar una gran cantidad de PIN actualmente en uso. Cualquier PIN conocido podría tener una probabilidad de 1 / 20k de ser correcto para un cliente determinado.

    
pregunta maple_shaft 07.06.2017 - 15:19
fuente

1 respuesta

1

Tiendo a estar de acuerdo contigo en que tu equipo de negocios está exagerando la necesidad de que los 'PIN' sean únicos entre los clientes, pero tienes que decidir si continuar peleando la lucha o comenzar a trabajar para satisfacer sus requisitos.

Veo un par de maneras en que puedes lograr esto. La primera es crear un repositorio separado de PIN asignados que puede consultar durante el proceso de generación de PIN nuevo. El enfoque más rápido sería mantener estos datos encriptados y descifrarlos solo para realizar una búsqueda o agregar una nueva entrada. Esto ofrece cierta protección de los datos al tiempo que es muy eficiente.

Sin embargo, si un atacante logra obtener acceso a la clave de descifrado, también puede descifrar estos datos, razón por la cual muchas personas en nuestra industria no quieren cifrar a autenticadores secretos en lugar de hacerles piruetas. Puede combatir este riesgo mediante el uso de hardware para almacenar la clave y administrar el cifrado, pero eso agrega gastos a su solución.

Alternativamente, puede simplemente almacenar los PIN en su base de datos de autenticación primaria como lo haría normalmente. Tendrían (con suerte) una salación individual con sales únicas y se someterían a iteraciones de hashing apropiadas (utilizando algo como PBKDF2, bcrypt, argon2, etc.). Cuando se genere un nuevo PIN, su sistema necesitará recuperar cada registro de hash, extraer el salt y usarlo junto con el nuevo PIN para repetir su proceso de hashing normal. Luego, los resultados se compararán y, si coinciden, deberá generar un PIN nuevo porque sabe que hay un conflicto.

La desventaja de este enfoque es que el tiempo y el costo de cálculo necesarios para completar este proceso de comparación. En la mayoría de los casos, recuperará todos los registros y repetirá el proceso de hashing muchas veces. Dependiendo de la velocidad de su proceso de hash y la cantidad de registros existentes, puede tomar de 5 a 20 segundos. Probablemente no sea una demora intolerable en un proceso que no se enfrenta al usuario que solo ocurre ocasionalmente, pero tendrá que considerar ese costo dado su entorno específico. Esto es ineficiente pero preserva mejor la seguridad de los PIN.

    
respondido por el PwdRsch 07.06.2017 - 19:33
fuente

Lea otras preguntas en las etiquetas