Estoy trabajando con un proveedor que proporciona una API con un método de registro de usuario claramente diseñado para contraseñas generadas por humanos. Sin embargo, estamos llamando a la API sin conexión de servidor a servidor y nos estamos registrando con la API en nombre de nuestro usuario.
Me siento relativamente cómodo con la idea de generar nuestra propia criptovariable, en lugar de reutilizar la contraseña del usuario o forzar al usuario a generar su propia segunda contraseña para la API. De cualquier manera, debido al diseño de la API, nos veremos obligados a almacenar la contraseña / criptovariable, que además se cifrará tanto en reposo como en el cable.
La única queja que tengo es que la API (de nuevo, aparentemente diseñada para contraseñas generadas por humanos), tiene algunas restricciones en el formato de contraseña que disminuyen la entropía cuando se utiliza un generador de números aleatorios criptográficos para generar la "contraseña" (con mayor precisión una criptovariable). Puedo hacer los cálculos en todos ellos excepto uno (y hacer que el código sea correcto también es bastante razonable).
La regla de "contraseña" más criptovariable y hostil es que no puede haber secuencias repetidas de caracteres en la contraseña. En otras palabras (y sin tener en cuenta las otras reglas de contraseña que impone la API), 'ab' y 'ba' están bien, pero 'aa' y 'bb' no. Para ese caso simple específico, suponiendo una longitud fija de dos y solo los dos símbolos 'a' y 'b', puedo ver que la restricción reduce exactamente la entropía, y también puedo ver que es mejor a medida que aumenta la longitud. En mi caso, simplemente duplicaría la duración y lo llamaría un día, excepto que también hay una restricción de longitud máxima de contraseña (¡doh!).
Basta de antecedentes: mi pregunta concisa es:
¿Cuál es la entropía de una criptovariable de 48 símbolos de longitud fija, generada aleatoriamente, que consta de 64 símbolos (AZ, az, 0-9, + y /), donde cualquier combinación con cualquier secuencia repetida de símbolos? ¿Están excluidos?
Como cuestión de edificación personal, también me gustaría saber no solo cuál es la respuesta en este caso específico, sino que también me gustaría entender cómo determinar la entropía para las condiciones "no repetitivas" para varias longitudes. y conjuntos de símbolos. Parece que esto podría ser incluso un ejercicio en un libro de texto de criptografía, y me encantaría una referencia.
Y, ahora que estoy listo para admitir que ya he pasado MUCHO más tiempo en esto de lo que esperaba, también me pregunto:
¿Estoy siendo paranoico?
Específicamente, dado que las contraseñas que siguen estas reglas son teóricamente "lo suficientemente seguras" de los ataques de fuerza bruta que la entropía restante es "suficiente", puedo, en buena conciencia, simplemente confiar en que la API es ¿Bastante "suficientemente bueno", llámalo un día y vete a tomar una cerveza?
- Tim
p.s. También debo tener en cuenta que estoy abierto a otras soluciones fuera de la caja para el problema en cuestión también, pero ya he descartado almacenar la contraseña generada por el hombre en forma local y pedirle al usuario de manera interactiva cuando necesitamos pasarla. a través de la API.
Reutilizar la contraseña del usuario nos obligaría a almacenar localmente la contraseña personal real del usuario, en lugar de utilizar la práctica estándar de la industria, mucho más apropiada, de almacenar un hash de la contraseña de una sola vía, por lo que definitivamente no queremos haz eso.
Forzar la interacción del usuario para generar una segunda contraseña es una mala experiencia para el usuario en general, y prácticamente garantiza un alto grado de reutilización de la contraseña por parte de muchos usuarios, por lo que tampoco queremos hacerlo. Además, y de manera más crítica, estamos accediendo a la API en su mayoría fuera de línea. A pesar de la acidez estomacal, este problema en particular me está dando, el uso sin conexión es totalmente compatible con la API según la documentación. En cualquier caso, dado que estamos accediendo a la API sin conexión, no tenemos la oportunidad de solicitar al usuario que ingrese la contraseña, por lo que tampoco podemos hacerlo.