Asegurar información sobre intentos de contraseña

1

Digamos que estoy creando un programa que funciona sin conexión, por lo que la información de la contraseña debe almacenarse localmente (lo sé, no es óptima, pero este es solo un proyecto personal mío). En términos de mantener la contraseña segura, pensé que podría utilizar un KDF como PBKDF2 o scrypt para obtener dos claves de la contraseña, una para la autenticación y otra para el cifrado / descifrado para mantener segura la información confidencial dentro del propio programa.

Ahora, digamos que quería agregar una función adicional para que el usuario pueda limitar los intentos de contraseña, de manera que exceder estos límites podría bloquear a un posible atacante fuera del programa por un período de tiempo determinado. Mi pregunta sería cómo mantener segura la información, como la cantidad de intentos realizados con la contraseña. Por ejemplo, el programa registrará la cantidad de intentos realizados en un archivo, de modo que si un atacante potencial pudiera cerrar y volver a abrir el programa, se guardó la cantidad de intentos ya realizados. ¿Cuál sería un método que podría emplear para asegurar este registro de modo que un atacante no pueda entrar y cambiar el número registrado de intentos para decir 0 y continuar para un número ilimitado de intentos?

    
pregunta ERK 04.05.2017 - 17:26
fuente

1 respuesta

3

Estás en un dispositivo hostil (la computadora de un usuario), así que debes asumir que pueden manipular tu código. Por lo tanto, no puede limitarse de esa manera: puede asegurarse de que las contraseñas utilizadas sean lo suficientemente largas para resistir los intentos de fuerza bruta (por ejemplo, un hash SHA-256 significaría que un atacante tendría que intentar millones de intentos por segundo para poder asegúrese de descifrar los datos durante la vida útil del universo, asumiendo una implementación perfecta del cifrado), puede intentar detectar múltiples intentos, o puede intentar ofuscar el número de intentos, pero siempre habrá formas para que un atacante omita estos.

Por ejemplo, si un atacante ejecutó su software en una máquina virtual, podría restaurar a una instantánea tomada antes de un intento de contraseña cuando se activó su restricción.

Para vencer eso, deberías controlar la capa de descifrado en un dispositivo que controlas, posiblemente un servicio basado en Internet, que devuelve datos descifrados o un mensaje de error. Simplemente no puede devolver la contraseña correcta, ya que eso implicaría que hay algún elemento local donde se puede ingresar una contraseña. No puede confirmar que la contraseña sea correcta, por el mismo motivo.

Una alternativa a un servicio basado en Internet sería un dispositivo de hardware que esté conectado a la computadora del usuario y que actúe de la misma manera: con una contraseña correcta, devuelve los datos cifrados, de lo contrario incrementa un contador de fallas y rechaza los intentos posteriores cuando esto alcanza un nivel específico. Este dispositivo tendría que ser a prueba de manipulaciones, no es bueno si puede abrirlo y leer la memoria directamente. Este es esencialmente el método que utiliza Apple con el iPhone, donde el dispositivo está integrado en el teléfono, pero con una interacción muy limitada con el resto del sistema.

    
respondido por el Matthew 04.05.2017 - 17:52
fuente

Lea otras preguntas en las etiquetas