Dos formas de generar el IV

5

Estoy viendo un código, y en un escenario particular, el código necesitaría generar dos IVs.

El segundo código que genera IV simplemente utiliza el C # Rijndael GenerateIV ()

El primer código que genera IV, aunque forma parte de la dirección MAC y parte de la hora actual e inserta partes de estos datos en una matriz de 16 bytes.

Entonces, en ambas partes del código, el IV generado se procesa una X constante de veces obteniendo el hash del IV y luego obteniendo algunos bytes aleatorios y re-hashing.

Preguntas :

  • ¿Ves alguna ventaja en tener dos formas de generar el IV?
  • ¿El hashing de generación post-IV es necesario o excesivo? - y es ¿algo estandarizado o alguna idea oscura?
  • ¿Podría haber algunos escenarios o configuraciones en los que la función GenerateIV no proporcione datos aleatorios?

Notas :

  • Estos IVs están diseñados para ser usados en encriptación
  • CipherMode es CBC
pregunta Zuiq Pazu 17.10.2015 - 11:42
fuente

2 respuestas

3

La forma correcta de generar un IV para el modo CBC es con un generador aleatorio criptográficamente seguro. Hay casos en los que un IV no aleatorio está bien, pero a menos que haya analizado cuidadosamente su sistema para asegurarse de que se encuentra en estos casos, debe ir con un IV aleatorio. Hay muy pocas situaciones en las que el uso de un IV no aleatorio tendría algún beneficio de todos modos, así que vaya con un IV aleatorio.

No estoy familiarizado con la API de C #, pero dado que documentación de GenerateIV afirma que" genera un vector de inicialización aleatorio (IV) para usar para el algoritmo ", parece ser una forma válida de generar un IV para CBC (pero CreateEncryptor ya realiza el mismo trabajo).

Tomar el hash de estos bytes aleatorios es estrictamente hablando un riesgo, porque reduce la entropía de la IV: no se sabe que los hashes criptográficos sean supuestos. (Supongo que te refieres a un hash criptográfico como SHA-256; un hash no criptográfico definitivamente sería problemático). Sin embargo, no creo que haya ningún problema concreto con eso: en la práctica, creo que es inofensivo. p>

La adición de algunos bytes aleatorios y el hashing repetidamente debería ser igualmente seguro. Sin embargo, es una complejidad innecesaria. La complejidad innecesaria debe activar las alarmas en cualquier contexto de seguridad. Esto aumenta el riesgo de un error de implementación, como filtrar datos confidenciales (aunque no es un gran problema, ya que la IV no tiene que ser confidencial, pero sería una consideración definitiva si estuviera generando una clave), sobrescribiendo los datos debido a un desbordamiento del búfer o un cálculo de puntero incorrecto, el recuento de iteraciones es 0 cuando se necesita al menos una iteración, etc.

El segundo método que propones definitivamente no es seguro sin el paso adicional de hashing-with-random. Las direcciones MAC y el tiempo son predecibles, y CBC requiere un IV impredecible . Los ataques contra CBC con un IV predecible no se aplican a todos los sistemas (confían en que el adversario pueda enviar mensajes para cifrar), pero ¿por qué arriesgarse? Además, las direcciones MAC y el tiempo no son necesariamente únicos: piense en máquinas virtuales clonadas, programas multiproceso, proceso rápido que sirve a dos clientes en el mismo reloj, etc.

Con el paso de hashing-with-random adicional, comenzar desde la dirección MAC y el tiempo no debe distinguirse de la aleatoria, siempre que se inyecten suficientes datos aleatorios. Pero volvemos al problema de la complejidad: ¿qué tan seguro está de que lo está haciendo bien?

Si la razón de esta complejidad adicional es "hacerlo más aleatorio" ... el azar no funciona de esa manera. No puedes hacer que el azar sea más aleatorio simplemente jugando con él, existe un grave riesgo de que lo arruines y lo hagas menos aleatorio.

Hacer algo más que tomar un IV al azar (por ejemplo, con GenerateIV ) aumenta el costo de mantenimiento (comenzando con el tiempo que dedica a preocuparse), reduce el rendimiento y aumenta el riesgo. Así que solo usa un IV aleatorio.

Si la implementación de una versión actualizada del código es costosa, este no es un problema crítico. (Si el IV fue solo el tiempo de MAC +, puede ser crítico o no, dependiendo del sistema en general). Pero debe fijarse en el código base y desplegarse con la próxima versión normal.

    
respondido por el Gilles 17.10.2015 - 21:46
fuente
3

Un generador seguro de números pseudoaleatorios (CSPRNG) es casi tan seguro como lo vas a obtener. Las dos referencias a las que apunta son CSPRNG, por lo que cualquiera debería ser suficiente para una IV. Hashing no hace al azar más aleatorio. Usar dos mecanismos diferentes no tiene sentido y duplica la posibilidad de cometer un error.

En el caso de GenerateIV , las cosas ya son aleatorias, por lo que el siguiente hashing y la adición de más datos aleatorios no ayudan.

El uso de la dirección MAC y el tiempo para crear la matriz inicial parece bastante inútil, ya que ambos están lejos de ser secretos. Si un atacante conoce la dirección MAC de la computadora y la hora, pueden adivinar rápidamente la marca de tiempo exacta. Así que toda la aleatoriedad de esta creación IV proviene de los bytes aleatorios agregados al final. Tal vez eso sea suficiente, no puedo decir sin ver el código real.

Tenga en cuenta que, según Principio de Kercckhoff , no se obtiene ningún beneficio adicional mediante el uso de un algoritmo secreto.

Mi consejo es que simplemente uses los datos de GenerateIV como tu IV y que lo hagas en todos los casos.

    
respondido por el Neil Smithline 17.10.2015 - 19:25
fuente

Lea otras preguntas en las etiquetas