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