2008-08-29 12 views
8

Me gustaría vincular un archivo de configuración a mi ejecutable. Me gustaría hacer esto almacenando un hash MD5 del archivo dentro del ejecutable. Esto debería evitar que nadie más que el ejecutable modifique el archivo.¿Cómo almaceno información en mi ejecutable en .Net

Esencialmente si alguien modifica este archivo fuera del programa, el programa no debería volver a cargarlo.

EDITAR: El programa procesa la información de la tarjeta de crédito, por lo que la posibilidad de cambiar la configuración de cualquier manera podría ser un riesgo de seguridad potencial. Este software se distribuirá a una gran cantidad de clientes. Lo ideal es que el cliente tenga una configuración vinculada directamente al ejecutable. Con suerte, esto evitará que un hacker pueda implementar una configuración falsa.

La configuración aún necesita ser editable, aunque compilar una copia individual para cada cliente no es una opción.


Es importante que sea dinámico. Para que pueda vincular el hash al archivo de configuración a medida que cambia la configuración.

Respuesta

11

Una mejor solución es almacenar el MD5 en el archivo de configuración. Pero en lugar de que el MD5 sea solo del archivo de configuración, también incluya algún valor secreto de "clave", como un guiado fijo, en el MD5.

write(MD5(SecretKey + ConfigFileText)); 

Luego simplemente elimine ese MD5 y vuelva a crear el archivo (incluida su clave secreta). Si los MD5 son iguales, entonces nadie lo modificó. Esto evita que alguien lo modifique y vuelva a aplicar el MD5 ya que no conocen su clave secreta.

Tenga en cuenta que esta es una solución bastante débil (como la que está sugiriendo) ya que podrían rastrear fácilmente en su programa para encontrar la clave o donde se almacena el MD5.

Una mejor solución sería usar un sistema de clave pública y firmar el archivo de configuración. De nuevo, eso es débil ya que eso requeriría que la clave privada se almacenara en su máquina local. Prácticamente todo lo que está contenido en su PC local puede pasarse por alto con suficiente esfuerzo.

Si REALMENTE desea almacenar la información en el archivo ejecutable (lo cual desaconsejaría), puede intentar agregarla al final del archivo EXE. Eso es generalmente seguro. La modificación de programas ejecutables es virus como comportamiento y la mayoría de la seguridad del sistema operativo intentará detenerte también. Si su programa está en el directorio Archivos de programa, y ​​su archivo de configuración está en el directorio de datos de la aplicación, y el usuario ha iniciado sesión como no administrador (en XP o Vista), entonces no podrá actualizar el EXE.

Actualización: No me importa si está utilizando el cifrado asimétrico, RSA o criptografía cuántica, si usted está almacenando sus teclas en el ordenador del usuario (que se debe hacer a menos que la ruta todo a través de una red servicio), entonces el usuario puede encontrar sus claves, ¡incluso si eso significa inspeccionar los registros en la CPU en tiempo de ejecución! Solo se está comprando un nivel moderado de seguridad, así que quédese con algo que sea simple. Para evitar modificaciones, la solución que sugerí es la mejor. Para evitar la lectura, encripte, y si está almacenando su clave localmente, utilice AES Rijndael.

Actualización: El FixedGUID/SecretKey podría generarse alternativamente en el momento de la instalación y almacenarse en algún lugar "secreto" en el registro. O puede generarlo cada vez que lo use desde la configuración del hardware. Entonces te estás volviendo más complicado. Cómo desea hacer esto para permitir niveles moderados de cambios de hardware sería tomar 6 firmas diferentes, y hash su archivo de configuración 6 veces, una vez con cada uno. Combine cada uno con un segundo valor secreto, como el GUID mencionado anteriormente (ya sea global o generado en la instalación). Luego, cuando revises, verificas cada hash por separado. Siempre y cuando tengan 3 de 6 (o lo que sea su tolerancia) entonces usted lo acepta. La próxima vez que lo escriba, lo hashe con la nueva configuración de hardware. Esto les permite intercambiar hardware lentamente con el tiempo y obtener un sistema completamente nuevo. . . Quizás eso es una debilidad. Todo se reduce a tu tolerancia. Hay variaciones basadas en tolerancias más estrictas.

ACTUALIZACIÓN: Para un sistema de tarjeta de crédito es posible que desee considerar un poco de seguridad real. Debe conservar los servicios de un asesor de seguridad y criptografía . Se necesita intercambiar más información. Necesitan analizar sus necesidades y riesgos específicos.

Además, si desea seguridad con .NET, primero debe comenzar con un ofuscador .NET realmente bueno (just Google it). Un ensamblado .NET es fácil de desensamblar y obtener el código fuente y leer todos sus secretos. No debe sonar como un disco roto, pero todo lo que depende de la seguridad del sistema de su usuario es fundamentalmente defectuoso desde el principio.

+0

Simplemente en una pequeña nota, incluso si está escrito en C++, si envía/almacena el secreto, está arriesgándose a que se lo roben (Esta es la parte clave aquí). La única forma segura de lograr la seguridad adecuada aquí es nunca enviar el secreto. Es probable que necesite algún tipo de cifrado de dos partes mediante el cual el usuario y sus propias claves privadas se utilizan. Como dijo Jim, necesita un analista de seguridad adecuado y asesoramiento profesional aquí. – Gregory

-2

acaba de hacer una const string que contiene el hash MD5 y compilarlo en su aplicación ... su aplicación puede entonces sólo se refieren a esta cadena const al validar el archivo de configuración

1

Por pura curiosidad, ¿cuál es su razonamiento para no querer cargar el archivo si se ha cambiado?

¿Por qué no mantener toda la información de configuración compilada en el archivo ejecutable? ¿Por qué molestarse con un archivo externo en absoluto?

Edición

acabo de leer tu edición de este ser un programa de información de tarjetas de crédito. Eso plantea un desafío muy interesante.

Creo que, por ese nivel de seguridad, sería necesario algún tipo de cifrado bastante importante, pero no sé nada sobre cómo manejar ese tipo de cosas de forma que los secretos criptográficos no puedan extraerse del ejecutable.

¿Se puede autenticar contra algún tipo de fuente en línea?

1

Le sugiero que utilice Cifrado de clave asimétrica para cifrar su archivo de configuración, donde sea que estén almacenados, dentro del archivo ejecutable o no.

Si mal no recuerdo, RSA es una de las variantes.

Para la explicación de la misma, ver Public-key cryptography Wikipedia

tienda la tecla "leer" en su ejecutable y mantener a sí mismo la tecla "escritura". Entonces nadie más que tú puede modificar la configuración.

Esto tiene las ventajas de:

  • nadie puede modificar la configuración a menos que tengan la clave "escritura" porque se corrupta por completo, incluso si saben que la "lectura" clave de cualquier modificación llevaría años calcular la otra clave.
  • Garantía de modificación.
  • No es difícil, hay muchas bibliotecas disponibles en estos días. También hay muchos programas de generación de claves que pueden generar claves realmente largas.

Investigue cómo implementarlos correctamente.

Cuestiones relacionadas