elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Como Elimino de la RAM un valor??
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como Elimino de la RAM un valor??  (Leído 5,222 veces)
Skeletron


Desconectado Desconectado

Mensajes: 1.731


A long way to go


Ver Perfil WWW
Como Elimino de la RAM un valor??
« en: 28 Febrero 2009, 23:45 pm »

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...


En línea

Skeletron


Desconectado Desconectado

Mensajes: 1.731


A long way to go


Ver Perfil WWW
Re: Como Elimino de la RAM un valor??
« Respuesta #1 en: 28 Febrero 2009, 23:48 pm »

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??


En línea

Foxy Rider


Desconectado Desconectado

Mensajes: 2.407


Deprecated


Ver Perfil WWW
Re: Como Elimino de la RAM un valor??
« Respuesta #2 en: 1 Marzo 2009, 02:13 am »

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

Código
  1. using(System.Security.SecureString _pText = new System.Security.SecureString()){
  2.              // tu codigo aqui
  3. }
  4.  

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

Alex~
En línea

Skeletron


Desconectado Desconectado

Mensajes: 1.731


A long way to go


Ver Perfil WWW
Re: Como Elimino de la RAM un valor??
« Respuesta #3 en: 1 Marzo 2009, 17:05 pm »

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...
En línea

Skeletron


Desconectado Desconectado

Mensajes: 1.731


A long way to go


Ver Perfil WWW
Re: Como Elimino de la RAM un valor??
« Respuesta #4 en: 1 Marzo 2009, 22:57 pm »

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


Código:
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??
En línea

Foxy Rider


Desconectado Desconectado

Mensajes: 2.407


Deprecated


Ver Perfil WWW
Re: Como Elimino de la RAM un valor??
« Respuesta #5 en: 3 Marzo 2009, 22:22 pm »

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 :

Citar
Una 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~
En línea

Skeletron


Desconectado Desconectado

Mensajes: 1.731


A long way to go


Ver Perfil WWW
Re: Como Elimino de la RAM un valor??
« Respuesta #6 en: 4 Marzo 2009, 03:51 am »

Muchas gracias..


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

Código:
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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Como elimino el Ground.exe me tiene harto!
Seguridad
Armilys25 3 4,233 Último mensaje 1 Septiembre 2022, 11:13 am
por ElMag0
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines