¿Es seguro firmar de ataques de fuerza bruta?

1

Estoy usando es peligroso firmar una cadena con una clave secreta . Dice que el mecanismo de firma es HMAC y SHA1 y que es una implementación del módulo de firma Django.

Suponiendo que uso una clave secreta para firmar muchas cadenas, y un atacante se hace con la firma completa my string.wh6tMHxLgJqB6oY1uT73iMlyrOA (incluida la parte de "mi cadena"), ¿qué tan fácil sería para el atacante hacer fuerza bruta en esto? ¿Control de mi clave secreta?

Supongo que el atacante podría adivinar que estoy usando su peligroso y podría gastar dinero para aprovisionar un montón de servidores en la nube.

¿Es esto algo de lo que debería preocuparme?

    
pregunta Justin Krause 09.08.2017 - 17:07
fuente

1 respuesta

3

Tras un breve vistazo al módulo, está utilizando un HMAC junto con SHA-1 (o SHA -512 en versiones más nuevas). Este es el mismo algoritmo que se usa en TLS para detectar la manipulación de datos.

Pero un HMAC se puede calcular rápidamente. Los principales costos en el HMAC son el cálculo de hash (es decir, SHA-1 en su caso) que se necesita dos veces. Esto significa que si tienes un secreto débil es posible un ataque de fuerza bruta. Y, mientras Signer parece ofrecer el uso de una función de derivación de claves para "endurecer" la clave, las funciones ofrecidas son solo un hash simple o un HMAC (es decir, dos hashes), que en realidad no frenan un ataque de fuerza bruta.

Esto significa que la seguridad de este enfoque reside en elegir una buena clave secreta, es decir, una cadena aleatoria larga en lugar de una contraseña corta comparable. Desafortunadamente, la documentación no muestra realmente qué claves son seguras y solo hace algunas recomendaciones similares a las recomendaciones de contraseña:

  

Dada una clave que solo tú conoces ... Entonces, si mantienes la clave en secreto y compleja, estarás bien.

Pero a partir de recomendaciones de contraseña similares, todos sabemos cuán seguras serán esas claves al final. Lo que realmente debería usar está oculto en el código fuente en la documentación de derive_key :

  

def derive_key (self):
          ...           Tenga en cuenta que la derivación clave en su peligro no es intencionada           para ser utilizado como un método de seguridad para hacer una clave compleja de un corto           contraseña. En su lugar, debes usar grandes claves secretas aleatorias .

Lo siguiente crearía un secreto con 128 bits aleatorios que es lo suficientemente seguro contra ataques de fuerza bruta:

 import os
 secret_key = os.urandom(16)
    
respondido por el Steffen Ullrich 09.08.2017 - 17:48
fuente

Lea otras preguntas en las etiquetas