Como Elimino de la RAM un valor??

Iniciado por Skeletron, 28 Febrero 2009, 23:45 PM

0 Miembros y 1 Visitante están viendo este tema.

Skeletron

Hola gente..
Desde un archivo leo una contraseña,.. la utilizo, y luego quiero que se borre de la ram.. para que no pueda ser leida...
Alguien sabe como???

por ejemplo:

1º.Leo Contraseña
2º. Compruebo si es igual a la que se ingresó..
3º. Es correcto... borro la contraseña de la ram..
4º. realizo las acciones..

Espero su respuesta...

Skeletron

Supongamos que la contraseña leida está guardada en la variable llamada: "contraseña"

Puedo hacer:

Contraseña = ""

Y ya se sobreescribe el valor anterior y listo??

Foxy Rider

http://msdn.microsoft.com/es-es/library/system.security.securestring(VS.80).aspx

Código (csharp) [Seleccionar]

using(System.Security.SecureString _pText = new System.Security.SecureString()){
              // tu codigo aqui
}


como implementa IDisposable, podés usar "eliminación determinística" con using <-- nótese las comillas ..

Alex~

Skeletron

Gracias Alex...
entre los corchetes, lo que tengo que poner es:

Leer la contraseña del archivo
compararla con la que ingresaron
si es correcta ingresar al programa..

Y ahí se cierra el Using no?
O sea.. en donde "manejo" el string que quiero ocultar...

Skeletron

Muestro ésto y hago mas facil su ayuda...


Dim contraingresada As String = campocontraseña.text
Dim sr As New IO.StreamReader("c:\prueba.txt")
Dim contraleida = sr.ReadLine()
If contraingresada <> contraleida Then
      MsgBox("Contraseña Incorrecta")
      End
Else
     inicioprograma()
End If



Como veran, leo una contraseña de un archivo, y la comparo con una que se ingresó por teclado en un campo de texto..
Luego ingreso o no al programa


Yo no puedo usar el SecureString porque no podria compararlas.
Pero si necesito que luego de que termine ese IF, esas 2 variables, la que se ingresó y la que leí del archivo, se borren de la memoria....


Alguna idea??

Foxy Rider

Oh, VB ...
disculpa que estuve offline : exámenes >_<
el ejemplo que te dí es para C#, así que, supongo que no te sirve ...
podés llamar Dispose() directamente en el objeto SecureString ...

System.String no implementa IDisposable, así que es todo un tema saber si REALMENTE se fue de la memoria ...
Pasa que en .NET no hay eliminación determinística verdadera, todo está a la merced del GC...
lo que podés hacer es tomar prácticas que "sugieran" la inutilidad de un objeto en un X momento ...

es más, cito de SecureString esto :

CitarUna instancia de la clase System.String es inmutable y, cuando ya no se necesita, no se puede planear mediante programación para la recolección de elementos no utilizados; es decir, la instancia es de sólo lectura una vez creada y no es posible predecir cuándo se eliminará de la memoria del equipo. Por consiguiente, si un objeto String contiene información confidencial, como una contraseña, un número de tarjeta de crédito o datos personales, existe el riesgo de que la información se pueda revelar una vez utilizada, porque la aplicación no puede eliminar los datos de la memoria del equipo.

con SecureString sí podés compararlas..
acá te dejo un post : http://weblogs.asp.net/pglavich/archive/2005/08/12/422330.aspx y http://weblogs.asp.net/pglavich/archive/2005/08/15/422525.aspx

Ahora (lo que le quita sentido al post anterior y parte de este post), para qué esmerarse en  borrar la string obtenida de un archivo, ya que si te ponés con FileMon al segundo sacás que X proceso abrió tal archivo y obtenés esa string (que en teoría DEBERÍA ESTAR cifrada en algún algoritmo) ..

si referís a la contraseña ingresada por el usuario ..
borrar la string que puso el usuario es tan simple como pass = "" para quitarle el contenido ...

pero tené en cuenta que si realmente querés algo de seguridad, vas a guardar el hash de la contraseña correcta en el mismo compilado, vas a tomar lo ingresado por el usuario, cifrar ese input con algún algoritmo (ver abajo) y comparar hashes ...
después, si es correcto la string con el valor ingresado se la setea en "", inicializás el programa y listo  (al no poderse borrar, aunque claro, podés perder la referencia al objeto a propósito así el GC lo marca para la eliminación)...
o sea, lo estándar....

claro que este método es vulnerable a colisiones (donde dos inputs distintos dan un mismo output)
podrías agregarle salt al hash (http://en.wikipedia.org/wiki/Salt_(cryptography) para evitar esto (aunque si mal no recuerdo, oí de unos artículos sobre cómo calcular el salt de un hash)

MD5 : http://msdn.microsoft.com/en-us/library/system.security.cryptography.md5.aspx
SHA512 : http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha512.aspx

Alex~

Skeletron

Muchas gracias..


Te comento que estuve leyendo tambien en algunos lugares... y descubrí éste codigo:

Dim message As Byte() = Codificacion.GetBytes(strCadena)

Dim criptoProvider As New TripleDESCryptoServiceProvider

Dim criptoTransform As ICryptoTransform = criptoProvider.CreateEncryptor(criptoProvider.Key, criptoProvider.IV)

Dim memorystream As New MemoryStream

Dim cryptoStream As New CryptoStream(memorystream, criptoTransform, CryptoStreamMode.Write)

cryptoStream.FlushFinalBlock()

Dim cifrado As Byte() = memorystream.ToArray

Dim cadenaEncriptada = Codificacion.GetString(cifrado)

Return cadenaEncriptada



Fijate como cryptoStream.FlushFinalBlock() hace lo que yo pedia tambien...
y el ="" tambien lo hace... pero suena poco eficiente (aunque no creo que sea tanto...)

Busqué sobre el FlushFInalBlock, al terminar, borra el bufer...
Creo que con eso me es suficiente para que quede todo con una bonita seguridad..

Las Keys y las Iv, son fijas para cifrar.. aunque uso 2 tipos...
Una keys e iv fijas para cifrar las keys e iv que cifra los Strings :O
DEFCON 10 ajajajajaja