2009-08-24 14 views

Respuesta

9

No puedo pensar en ninguna circunstancia en la que una llamada a Array.Clear fuera optimizada alguna vez e incluso si pudiera, solo se optimizaría en los casos en que su byte[] ya se haya borrado.

Editar: Otra cosa a considerar sería averiguar si SecureString aplicación del marco sería útil en su situación:

Un objeto SecureString es similar a un objeto String en que tiene un texto valor. Sin embargo, el valor de un objeto SecureString es automáticamente encriptada, puede ser modificado hasta que su solicitud lo marca como de sólo lectura, y se pueden borrar de la memoria del ordenador, ya sea por su aplicación o el recolector de basura de .NET Framework

+1

Si nadie puede leer la matriz después de que ha sido limpiado, entonces puede no optimizar el compilador no borrado su contenido? – Gautam

+0

Como una cuestión de orden: cuando dices _compiler_ ¿te refieres al compilador C# o al compilador JIT? –

1

Si le preocupa Array.Clear, siempre puede simplemente utilizar Marshal. Copie una matriz de bytes vacía en los datos confidenciales.

Por ejemplo, como este ('datos' suponiendo que es el byte [] que contiene la información sensible):

 byte[] clear = new byte[data.Length]; 
     unsafe 
     { 
      fixed (byte* ptr = &data[0]) 
      { 
       Marshal.Copy(clear, 0, new IntPtr(ptr), data.Length); 
      } 
     } 
0

que estaba bajo la impresión de que ya existían técnicas para mostrar la reciente estado de la memoria RAM. Luego están los tipos del MIT que congelaron algo de RAM, la levantaron y la llevaron a otro lugar y mantuvieron todo el estado.

lo tanto, si usted era un paranoico, que iba a escribir al azar un montón de datos a través de la matriz de un par de veces.

+0

Hicieron eso. Sin embargo, ese ataque asume el acceso al sistema físico. Defensa en profundidad ... – Spence

+0

La verdadera lección es que usted no pone secretos en su cliente, ya que su cliente siempre puede verse comprometido. – Spence

+0

@Spence: Sí, creo que es una locura que puedan hacer eso. :) –

4

Incluso si se Array.Clear guarenteed para ser ejecutado (no optimizado de distancia) Creo que es posible que tenga un problema. El GC puede mover objetos en el montón y no hay garantía de que los restos del byte original perduren si se movieron de una ubicación a otra antes de que se llamara Array.Clear.

Es posible que desee comprobar SecureString, ProtectedData o ProtectedMemory. Pero, si desea un enfoque más manual, creo que tendrá que al menos fijar el conjunto de bytes para que el GC no pueda moverlo. Creo que SecureString usa este truco también.

0

Un truco que funciona con la mayoría de los compiladores de C es hacer algo como suma de todos los elementos de la matriz despejado, y luego hacer algo con esa suma, como la impresión o XOR con el valor de retorno. De esta forma, la eliminación del código muerto no eliminará el borrado de la matriz.

Dicho esto, ¿está seguro de que sólo tiene que borrar esta matriz? Tenga en cuenta todos los otros lugares donde el valor también puede haber existido: un búfer en un formulario, objetos de cadena que se pasan, valores clave equivalentes en cálculos intermedios o paginado en el disco. Al poner en cero esta matriz solo obtendrás el 1% del camino hasta allí. Tienes que borrar toda la ruta de la clave.

1

Si está escribiendo su propia rutina de cifrado, mi consejo sería: no lo haga. Te equivocarás (al igual que yo, como cualquiera que no sea un experto en seguridad ). Use una biblioteca bien conocida y probada.

(Si no es así, no importa!) :)

+1

En algún momento debe llamar a la biblioteca y deberá saber cómo manejar los secretos que ingresa y sale de la biblioteca; de lo contrario, no puede crear un software seguro. –

+0

@JirkaHanika De acuerdo. – TrueWill

Cuestiones relacionadas