¿Es la clave secreta para HMAC en forma de caracteres UTF8 lo suficientemente buena?

3

Hay una popular biblioteca JWT en nuget. Estoy analizando una aplicación que usa esa biblioteca y almacena una clave secreta como una cadena. En el código de la biblioteca veo que usa el MS HMACSHA256 que acepta la matriz de bytes como una clave. Así que la biblioteca hace Encoding.UTF8.GetBytes(key) para pasar la clave secreta a la biblioteca.

Dado que la codificación UTF8 significa alguna estructura generalmente (por ejemplo, algunas secuencias de bytes no coincidirán con ninguno de los caracteres imprimibles), en comparación con algunas Base64 que pueden tener cualquier secuencia de bytes aleatoria, no significa que esta clave sea más predecible que debería ser?

¿Puede seguir siendo lo suficientemente seguro siempre y cuando la generación de esta clave sea la correcta, y cómo debería generarse en este caso?

    
pregunta Ilya Chernomordik 08.02.2016 - 12:49
fuente

1 respuesta

2

Supongo aquí que key es algo estático a nivel del sistema, y no algo que un usuario individual elija. Si es así, es muy extraño que se lea como UTF-8 en lugar de como Base64 porque UTF-8 será un mecanismo de almacenamiento ineficiente para la clave, ya que no utilizará el espacio completo. Daría esto a la ingenuidad del desarrollador en lugar de hacer cualquier cosa fuera de razón.

Este método tendría más sentido si fuera para una clave elegida por el usuario, ya que pueden haber ingresado caracteres Unicode como clave y, por lo tanto, si se almacena y se lee como UTF-8, se puede colocar en una clave. Función de estiramiento tal como PBKDF2. En este caso, el objetivo no es un almacenamiento eficiente, sino simplemente asegurarse de que una clave elegida por el usuario tenga suficiente entropía para ser útil.

  

¿no significa que esta clave es más predecible de lo que debería ser?

Cuando la tecla ingresa a la función HMAC, se incluye junto con el mensaje. El hecho de que sea de una cadena UTF-8 no debería hacer que los HMAC resultantes sean más predecibles ni debería hacer que la clave de forzoso sea más fácil. Siempre que la cadena original tenga suficiente entropía para comenzar, no importará a qué formato se haya convertido para el almacenamiento.

  

¿Puede seguir siendo lo suficientemente seguro siempre y cuando la generación adecuada de este   clave, y cómo se debe generar en este caso?

De esta respuesta , se recomendaría un valor aleatorio de 128 bits generado a través de un generador de números pseudoaleables criptográficamente seguro por la llave El CSPRNG generaría una secuencia de bytes, por lo que podría ser Base64'd y luego almacenarse como UTF-8, aunque el espacio de teclas nunca se complete completamente. Sería mejor si el paso UTF-8 pudiera eliminarse por completo, porque agrega una complejidad innecesaria.

    
respondido por el SilverlightFox 08.02.2016 - 20:44
fuente

Lea otras preguntas en las etiquetas