tag:blogger.com,1999:blog-21555208.post505930440911863494..comments2024-03-21T18:48:30.830+01:00Comments on Un informático en el lado del mal: Cómo proteger tu password cuando esté en memoria RAMChema Alonsohttp://www.blogger.com/profile/16328042715087424781noreply@blogger.comBlogger2125tag:blogger.com,1999:blog-21555208.post-11149946456414134262016-07-15T14:54:56.096+02:002016-07-15T14:54:56.096+02:00Quizas moleste un poco el necroposting pero me he ...Quizas moleste un poco el necroposting pero me he encontrado esta entrada por casualidad y tengo que decir que la implementacion del codigo en .NET aqui expuesta es insegura.<br /><br />Si partimos de una contraseña en un String, para convertirla a SecureString, estamos almacenando un objeto en el Heap que escapa a nuestro control para eliminarlo a nuestra conveniencia. Igualmente de forma inversa al pasar un SecureString a String.<br /><br />Debemos utilizar siempre tipos de datos por valor, no por referencia (que van al heap siempre) y asegurarnos que que esten en el Stack del proceso. Los tipos por valor se almacenan en el stack cuando el valor es una variable local o parametro de entrada y esta no es utilizada en una funciona anonima, una expresion Lambda o esta dentro de un iterador. De esta forma podemos limpiar la variable en cuanto hayamos terminado con ella para minimizar el riesgo de filtrado en un volcado de memoria.<br /><br />La estrategia correcta es tener en memoria un solo caracter de la contraseña en el Stack del proceso en cada momento y comparar las credenciales caracter por caracter y al finalizar limpiar la variable y no retornar o aceptar por parametro ningun String con la contraseña en ningun momento. Esto requiere mas codigo no administrado y cargarse pero a base de bien el tener un codigo bonito, desacoplado y con responsabilidad unica, pero es lo que hay.<br /><br />PD: En el mejor de los casos, ademas, ha olvidado limpliar la SecureString al final del metodo ConvertToUNSecureString llamando a secstrPassword.Dispose() porque si confia en el GC se puede tirar en memoria (aunque sea cifrada) un buen rato.Anonymoushttps://www.blogger.com/profile/13691024497441182438noreply@blogger.comtag:blogger.com,1999:blog-21555208.post-30593646803167728122016-01-28T16:38:25.903+01:002016-01-28T16:38:25.903+01:00Muy bueno para reforzar las cadenas, no conocía la...Muy bueno para reforzar las cadenas, no conocía la existencia de esa clase JavaAlberthttps://www.blogger.com/profile/02814686359082473416noreply@blogger.com