Cómo almacenar el IV y la clave de forma temporal pero segura

5

Estoy utilizando .NET 4.0 para desarrollar un servicio de Windows que almacenará temporalmente los datos cifrados en una base de datos. Los datos se cifrarán cuando se inserten, luego se descifran, se procesan y se eliminan una vez procesados. Esto probablemente se hará como un proceso por lotes (miles de filas a la vez).

He consultado Generando claves para el cifrado y el descifrado en MSDN, y parece que podría usar el cifrado simétrico TripleDES (estaba pensando en usar la clase RijndaelManaged).

Sin embargo, si el servicio falla o si pierdo la conexión de mi base de datos mientras cifro e inserto los datos, quiero poder continuar donde lo dejé con la misma IV y clave.

¿Cómo debo almacenar mi IV y la clave en una computadora local? Quiero estar seguro de que no se encontrará y se usará para descifrar el contenido cifrado de la base de datos.

    
pregunta Husein Roncevic 23.02.2012 - 14:52
fuente

2 respuestas

16

Al menos una cosa puede mejorar con bastante facilidad: simplemente puede almacenar el IV en la base de datos junto a los datos cifrados. El IV en sí mismo es que no se supone que es secreto . Por lo general, actúa como una sal, para evitar una situación en la que dos registros de texto simple idénticos se cifran en texto cifrado idéntico. Almacenar el IV en la base de datos para cada fila eliminará la preocupación sobre la pérdida de estos datos. Idealmente, cada fila IV sería única y aleatoria pero no secreta.

Eso deja tu problema para almacenar una información relativamente pequeña: la clave . No debería haber ningún problema con la misma clave para todos los registros en términos de seguridad. Mientras la clave en sí sea fuerte, usar una clave diferente no le otorga ninguna ventaja (de hecho, será un verdadero dolor de cabeza), por lo que una clave debería ser lo suficientemente buena.

Probablemente hay muchas soluciones para almacenar las claves de forma segura, pero éstas dependen del nivel de seguridad que realmente necesita. Para el entorno .NET / Microsoft supongo que deberías consultar DPAPI , aunque puede haber mejores opciones que hay. En un extremo, necesitaría un HSM o una tarjeta inteligente, pero en entornos menos estrictos que almacenen la clave en el sistema de archivos. con los permisos adecuados podría ser suficiente. Todo depende de su perfil de riesgo y amenazas.

    
respondido por el Yoav Aner 23.02.2012 - 16:10
fuente
8

Si entiendo su situación correctamente:

  1. El IV debe almacenarse en la base de datos, junto con los datos cifrados (concatenados en el mismo campo o en un campo separado en la misma fila). Esto se puede almacenar como texto sin formato, no hay ningún valor en su secreto.
  2. La clave de cifrado debe almacenarse en cualquier archivo o clave de registro, siempre que no sea accesible de forma remota, con dos restricciones: ACL fuerte, restringiendo el acceso a este archivo solo por la aplicación (y administradores); Se debe encriptar antes de guardar.

Con respecto al último punto, tenga en cuenta que la KEK (clave de cifrado de clave) aún deberá estar protegida ... Para esto, DPAPI (API de protección de datos) es ideal para la mayoría de las situaciones (aunque en algunos es posible que desee considerar alguna forma de módulo de hardware), probablemente en USER_MODE.
.NET le brinda fácil acceso a través de las clases ProtectedMemory y ProtectedData .

    
respondido por el AviD 23.02.2012 - 16:17
fuente

Lea otras preguntas en las etiquetas