none
Seguridad de clave encriptada RRS feed

  • Pregunta

  • Al entrar a mi programa uso un datareader para leer la clave de una tabla que guardo encriptada, algo asi:

    IfDesencriptar(dr.Item("clave"), key) = txtClave.Text Then

    la duda que tengo es si alguien puede parar el programa ahi y leer el valor de la clave desencriptada tal y como yo hago poniendo un punto de interrupción, ya que desconozco las herramientas que usan los hackers.

    jueves, 29 de octubre de 2015 16:06

Respuestas

  • "Cid105" preguntó:

    > Al entrar a mi programa uso un datareader para leer la clave de
    > una tabla que guardo encriptada, algo asi:
    >
    > If Desencriptar(dr.Item("clave"), key) = txtClave.Text Then
    >
    > la duda que tengo es si alguien puede parar el programa ahi y leer
    > el valor de la clave desencriptada tal y como yo hago poniendo un
    > punto de interrupción, ya que desconozco las herramientas que usan
    > los hackers.

    Hola:

    Lo que se dice "parar el programa", no creo que se pueda hacer, salvo que alguien descompile tu ejecutable con algún programa tipo .NET Reflector y cree un nuevo proyecto con Visual Studio. Entonces podría establecer los puntos de interrupción que le venga en gana.

    Otra cosa que también se puede hacer una vez que el programa se encuentre en ejecución, es crear un archivo de volcado de memoria desde el Administrador de tareas del sistema operativo, el cual generará en la carpeta de archivos temporales un archivo con el nombre del programa pero con la extensión *.dmp, extensión ésta que es reconocida por Visual Studio, por lo que tan sólo hay que hacer doble clic sobre el archivo para abrirlo con Visual Studio.

    Una vez abierto el archivo, tan solo hay que depurar la memoria administrada y empezar a investigar para ver la información que podemos leer, sobre todo los valores de aquellas variables declaradas a nivel global de la aplicación, ya sean del tipo alfanumérico (String) o del tipo matriz de valores Byte, como bien puede ser la clave de 32 bits que podemos estar utilizando para encriptar/desencriptar un valor mediante un algoritmo simétrico.

    Por eso es muy importante evitar declarar variables a nivel global de la aplicación, salvo que no haya más remedio que hacerlo, y siempre y cuando no contenga un valor comprometido que deseamos que nadie conozca.

    > If Desencriptar(dr.Item("clave"), key) = txtClave.Text Then

    Por ejemplo, si la variable 'key' tiene un ámbito de visibilidad superior al local, es posible que alguien pueda averiguar su valor analizando el archivo de volcado de memoria. Una vez conocido el valor, ya solo queda analizar el código que ejecutas en la función Desencriptar, o en otros procedimientos a los que ésta última invoca (cuestión que se puede hacer con el programa .NET Reflector o cualquier otro parecido, salvo que el código fuente lo tenga bien ofuscado), e intentar obtener el valor desencriptado de la clave.

    En definitiva, que dependerá de lo precavido que hayas sido a la hora de escribir el código fuente de tu aplicación. Si tienes tu código repleto de declaraciones de variables a nivel global, será más fácil averiguar su valor que si las variables las declaras a nivel local, y además tienes la precaución de eliminar su valor de la memoria cuando ya no la vayas a utilizar, estableciendo el valor de dichas variables a Nothing, porque conviene recordar que en .NET el valor de los objetos no se libera de la memoria de manera inmediata sino que se hará cuando el recolector de elementos no utilizados lo crea conveniente, comprobando si en el montón administrado hay objetos que la aplicación ya no utiliza y ejecutando las operaciones de limpieza necesarias para reclamar la memoria ocupada por los objetos, por tanto, los valores actuales de las variables globales estarán en memoria hasta que se cierre la aplicación. ;-)

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    sábado, 31 de octubre de 2015 16:03
    Moderador