¿Existe una forma de hash de árbol de MAC que se puede usar al cifrar los datos para el almacenamiento en S3 mediante la carga de varias partes?

4

Estoy almacenando archivos en S3, algunos de los cuales son muy grandes y necesitan ser almacenados encriptados. Había planeado usar el modo de contador de Galois ya que incluye el MAC, sin embargo, esto no funcionará con subidas de múltiples partes a S3. Necesito cifrar cada fragmento y almacenarlo en S3 junto con un MAC adecuado, luego calcular el MAC para el archivo completo una vez que todas las partes estén en su lugar. Una vez que se completa una carga multiparte a S3, ya no se puede acceder a las partes y solo queda un único archivo. Creo que necesito algún mecanismo de hash de árbol para admitir esto (tenga en cuenta que el sistema de almacenamiento Amazon Glacier está utilizando este método), pero preferiría evitar utilizar mi propio MAC por todas las razones habituales.

Aquí hay una página que explica cómo Glacier usa el hashing de árboles: enlace

¿Alguna sugerencia? Muchas gracias de antemano.

Actualizar

Finalmente conseguí este trabajo. Hacké la clase GCMBlockCipher en BouncyCastle para apoyar esto. Aquí están los cambios que deben hacerse:

  1. La clave de cifrado y el IV deberán almacenarse de forma segura en algún lugar (quizás encriptado en una base de datos) para que todas las máquinas que procesan las partes individuales puedan calcular los mismos valores iniciales, como la subclave hash.
  2. Si bien no es necesario conocer la longitud total de antemano, será necesario que se envíe un índice de bloque de inicio con cada fragmento, y cada fragmento enviado (excepto el final) debe ser un múltiplo de 16 bytes.
  3. El valor del contador debe incrementarse según el índice del bloque inicial para el fragmento.
  4. Una implementación que maneja el cifrado como un flujo largo realiza una sola multiplicación GHASH por bloque procesado. Para cuando se procese el último bloque, el valor de hash será correcto. En una implementación paralela, puede estar procesando un trozo en algún lugar en el medio, por lo que tiene que compensar las multiplicaciones "faltantes" que se habrían realizado al procesar bloques subsiguientes. Si se conoce de antemano la longitud total, esta corrección se puede aplicar justo después de procesar cada fragmento, o al final una vez que todas las piezas estén en su lugar. Los valores de hash para cada fragmento deberán almacenarse.
  5. Al final, todos los valores de hash para los fragmentos (con las correcciones de multiplicación aplicadas) deben ser xoreados juntos y luego ingresados en una forma modificada de doFinal () que realiza el resto de los cálculos de GMAC. Tenga en cuenta que el recuento final de bytes también debe incluirse, ya que forma parte del MAC.

Probablemente, las personas con mayor inclinación matemática pueden encontrar una mejor manera de manejar esto. :-)

    
pregunta Peter Friend 19.12.2012 - 22:28
fuente

1 respuesta

1

El componente GHASH de AES GCM es lineal. Si conoce la longitud de todas las partes del archivo y el orden en que se ensamblarán, puede usar esta linealidad para calcular el valor polinomial que necesita y luego agregar la parte aleatoria que hace que GHASH se convierta en GCM. La especificación para GCM debería proporcionar suficiente orientación sobre cómo hacerlo.

    
respondido por el Watson Ladd 20.12.2012 - 03:17
fuente

Lea otras preguntas en las etiquetas