Tengo un byte C# [] que contiene datos confidenciales. ¿Cuál es la mejor manera de borrarlo? ¿Cómo me aseguro de que algo como Array.Clear no se optimice?Limpiar una matriz de bytes C# con datos confidenciales
Respuesta
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 objetoString
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
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);
}
}
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.
Hicieron eso. Sin embargo, ese ataque asume el acceso al sistema físico. Defensa en profundidad ... – Spence
La verdadera lección es que usted no pone secretos en su cliente, ya que su cliente siempre puede verse comprometido. – Spence
@Spence: Sí, creo que es una locura que puedan hacer eso. :) –
yo sepa no hay un equivalente a SecureZeroMemory en CLR. Debe usar SecureString para almacenar sus datos.
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.
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.
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!) :)
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. –
@JirkaHanika De acuerdo. – TrueWill
- 1. Inserte una matriz de bytes en otra matriz de bytes en una posición específica con C#
- 2. ¿Cómo convierto una matriz de bytes C# en datos estructurados?
- 3. Almacenamiento de datos confidenciales con Drupal
- 4. Lectura de una estructura de datos C/C++ en C# desde una matriz de bytes
- 5. Convertir una matriz de bytes a una clase que contiene una matriz de bytes en C#
- 6. Filtrar datos confidenciales con la videograbadora
- 7. Adjuntar datos a la matriz de bytes
- 8. Datos confidenciales en la memoria
- 9. Convirtiendo una matriz de bytes a una matriz de tipos primitivos con tipo desconocido en C#
- 10. en C#, ¿cuál es la forma correcta de manejar datos confidenciales como una contraseña?
- 11. Lectura de una matriz de bytes C# en Java
- 12. ¿Diseccionar una matriz de bytes en distintos tipos de datos?
- 13. Python 3 Creando una matriz de bytes
- 14. deserializar una matriz de bytes
- 15. Estrategia de codificación para proteger datos confidenciales
- 16. ¿Cómo puede Marshal una matriz de bytes en C#?
- 17. ¿Cómo convertir una matriz de bytes a una matriz int?
- 18. C#: Almacenar matriz de bytes en XML
- 19. ¿Cómo llenar una matriz de bytes con basura?
- 20. C# comparación de matriz de bytes
- 21. Elementos vacíos en matriz de bytes C#
- 22. Java: ¿Cómo "recortar" una matriz de bytes?
- 23. MemoryStream frente a una matriz de bytes
- 24. ¿Cómo convertir una matriz de bytes en doble en C?
- 25. ¿Convertir int a una matriz de bytes en C?
- 26. Convertir matriz de bytes a matriz corta en C#
- 27. ¿Existen leyes al trabajar con datos financieros confidenciales?
- 28. Eliminando los primeros 16 bytes de una matriz de bytes
- 29. ¿Cómo convierto una matriz de bytes Java en una matriz de bytes Scala?
- 30. Cómo convertir una matriz de bytes en una matriz int?
Si nadie puede leer la matriz después de que ha sido limpiado, entonces puede no optimizar el compilador no borrado su contenido? – Gautam
Como una cuestión de orden: cuando dices _compiler_ ¿te refieres al compilador C# o al compilador JIT? –