2010-06-01 25 views
9

Quiero verificar si los archivos de registro de texto creados por mi programa que se está ejecutando en el sitio de mi cliente han sido alterados. ¿Cómo sugieres que haga esto? Busqué un montón aquí y google, pero no pude encontrar mi respuesta. ¡Gracias!¿La forma más fácil de firmar/certificar archivos de texto en C++?

Editar: Después de leer todas las sugerencias hasta ahora aquí están mis pensamientos. Quiero que sea sencillo, y dado que el cliente no es el experto en computadoras, creo que es seguro incluir la sal en el binario. Seguiré buscando una solución simple usando las palabras clave "hash de suma de comprobación de sal", etc. y publicaré aquí una vez que encuentre una.

+0

¿Por qué tiene esto la etiqueta "gpgpu"? GPGPU generalmente significa informática de propósito general en unidades de procesamiento gráfico. ¿Es un error tipográfico? –

Respuesta

1

Esto es algo bastante difícil de hacer, a menos que de alguna manera pueda proteger el par de teclas utilizado para firmar los datos. La firma de los datos requiere una clave privada, y si esa clave está en una máquina, una persona puede simplemente alterar los datos o crear nuevos datos, y usar esa clave privada para firmar los datos. Puede mantener la clave privada en una máquina "segura", pero ¿cómo puede garantizar que los datos no se alteraron antes de que saliera de la máquina original?

Por supuesto, si solo está protegiendo datos en movimiento, las cosas se vuelven mucho más fáciles.

La firma de datos es fácil, si puede proteger la clave privada.

Una vez que haya resuelto la teoría de nivel superior que garantiza la seguridad, eche un vistazo a GPGME para hacer la firma.

+0

¿Podría incrustar la clave privada en el binario? Estoy seguro de que esto se ha hecho antes y existe un proceso fácil conocido para hacer esto. Simplemente no puedo encontrarlo en google o aquí :( – user355008

+0

Puede ser trivial detectar la clave mirando el binario en un editor hexadecimal. – egrunin

+1

@ user355008: Incrustar una clave dentro de algo no ayudará. Si tu aplicación puede ver la clave de alguna manera, y luego un usuario también. – dreamlax

1

Puede poner una suma de comprobación como prefijo en cada una de sus líneas de archivo, usando un algoritmo como adler-32 o algo así. Si no desea poner código binario en sus archivos de registro, use un método encode64 para convertir la suma de verificación a datos no binarios. Por lo tanto, puedes descartar solo las líneas que han sido manipuladas.

+2

¿Cómo evitaría que un atacante volviera a calcular la suma de comprobación? – WhirlWind

+1

En la página wiki que compartió, dice "la suma de comprobación Adler-32 puede falsificarse fácilmente y, por lo tanto, es insegura para protección contra modificaciones intencionales ". Así que no creo que esto funcione. Gracias. – user355008

+2

No sé el nivel de seguridad requerido, así que escribí" como adler-32 o algo así ". Incluso puede usar adler-32 , md5 128 bits o métodos de hash sha1 con salazón, agregando tu propia clave a la cadena que se codificará. Por lo tanto, será muy difícil para alguien recalcular la suma de comprobación correcta. –

5

Obligatory preamble: ¿Cuánto está en juego aquí? Debe suponer que la manipulación será posible, pero que puede hacer que sea muy difícil si gasta suficiente tiempo y dinero. Entonces: ¿cuánto vale para ti?

Dicho esto:

Ya que es el código de la escritura de archivos, puede escribirlo cifrada. Si necesita que sea legible por humanos, puede conservar una segunda copia encriptada o un segundo archivo que contenga solo un hash, o escribir un valor hash para cada entrada. (El hash debe contener una clave "secreta", por supuesto.) Si esto es demasiado arriesgado, considere la posibilidad de transmitir hash o checksums o el log a otros servidores. Etcétera.

0

Es su archivo y su programa el que puede modificarlo. Cuando este es el caso, hay una solución simple. (Si usted puede permitirse el lujo de poner su archivo de registro en una carpeta separada)

Nota: Usted puede tener todos sus archivos de registro colocados en una carpeta separada. Por ejemplo, en mi aplicación, tenemos muchas DLL, cada una con sus propios archivos de registro y, por supuesto, la aplicación propia.

Así que tienen un proceso independiente que se ejecuta en segundo plano y supervisa la carpeta de las notificaciones cambios como

  • cambio en el tamaño del archivo
  • intento de cambiar el nombre del archivo o carpeta
  • eliminar el archivo etc. ...

Según esta notificación, puede certificar si el archivo se ha modificado o no. (A medida que usted y otros pueden estar adivinando, incluso su proceso de & dlls cambiarán estos archivos, que también puede conducir a una notificación. Necesita sincronizar esta acción inteligente. Eso es todo) API

ventana para monitorear carpeta en la que figura a continuación :

HANDLE FindFirstChangeNotification(
LPCTSTR lpPathName, 
BOOL bWatchSubtree, 
DWORD dwNotifyFilter 
); 

lpPathName: 
Path to the log directory. 

bWatchSubtree: 
Watch subfolder or not (0 or 1) 

dwNotifyFilter: 
Filter conditions that satisfy a change notification wait. This parameter can be one or more of the following values. 
FILE_NOTIFY_CHANGE_FILE_NAME 
FILE_NOTIFY_CHANGE_DIR_NAME 
FILE_NOTIFY_CHANGE_SIZE 
FILE_NOTIFY_CHANGE_SECURITY 
etc... 
(Check MSDN) 

Cómo hacer que funcione?

sospechoso A: Nuestro proceso

sospechoso X: otro proceso o usuario

Inspector: El proceso que hemos creado para supervisar la carpeta.

Inpector ve un cambio en la carpeta. Consultas con Sospechoso A si hizo algún cambio en él.

si es así,

change is taken as VALID. 

si no

clear indication that change is done by *Suspect X*. So NOT VALID! 
File is certified to be TAMPERED. 

Aparte de eso, a continuación son algunas de las técnicas que pueden (o no :)) ayudarle!

  1. Almacene la marca de tiempo siempre que una aplicación cierre el archivo junto con el tamaño del archivo. La próxima vez que abra el archivo, verifique la última hora modificada de la hora y su tamaño. Si ambos son iguales, significa que el archivo no está alterado.

  2. Cambie el privilegio de archivo a de solo lectura después de escribir registros en él. En algún programa o alguien quiere alterarlo, intentan cambiar la propiedad de solo lectura. Esta acción cambia la fecha/hora modificada para un archivo.

  3. Escriba en su archivo de registro solo los datos cifrados. Si alguien lo manipula, cuando descifremos los datos, es posible que encontremos texto no descifrado correctamente.

  4. Usando comprimir y mecanismo de la ONU a comprimir (comprimir puede ayudar a proteger el archivo con una contraseña)

Cada forma puede tener sus propias ventajas y desventajas. Fortalezca la lógica según su necesidad. Incluso puedes probar la combinación de las técnicas propuestas.

+1

Para el punto 1 y el punto 2: es fácil establecer el tiempo de modificación de un archivo y cambiar el contenido de un archivo sin cambiar su longitud. Para el punto 3 y el punto 4: debe comprender que si su aplicación puede realizar estas tareas, entonces el usuario también puede (simplemente imitando lo que hace la aplicación). – dreamlax

+0

@dreamlax: todos esos puntos brindados solo para dar una idea a los usuarios previstos. Sé que todo tiene agujeros. El foco principal está en los DATOS proporcionados sobre esos puntos tontos (si lo miras así). – AKN

1

Realmente depende de lo que está tratando de lograr, lo que está en juego y cuáles son las limitaciones.

Fundamentalmente: lo que está pidiendo es simplemente imposible (de forma aislada).

Ahora, se trata de complicar la vida de las personas que intentan modificar el archivo para que les cueste más modificarlo de lo que podrían ganar haciendo la modificación. Por supuesto, significa que los piratas informáticos motivados por el único objetivo de descifrar sus medidas de protección no se detendrán tanto ...

Suponiendo que debería funcionar en una computadora independiente (sin red), es, como dije imposible. Sea cual sea el proceso que utilice, sea cual sea la clave/algoritmo, esto está finalmente integrado en el binario, que está expuesto al escrutinio del posible pirata informático. Es posible desensamblarlo, es posible examinarlo con lectores hexadecimales, es posible sondearlo con diferentes entradas, conectar un depurador, etc. Su única opción es hacer que la depuración/examen sea un dolor al romper la lógica , usando detección de depuración para cambiar las rutas, y si eres muy bueno usando código de auto modificación. No significa que será imposible manipular el proceso, apenas significa que se volverá lo suficientemente difícil como para que cualquier atacante lo abandone.

Si tiene una red a su disposición, puede almacenar un hash en un disco distante (bajo su control), y luego comparar el hash. 2 dificultades aquí:

  • Almacenamiento (¿cómo asegurarse de que es su binario)
  • Recuperación (cómo asegurarse de que está hablando con el servidor correcto?)

Y, por supuesto, en tanto casos, tenga cuidado con el hombre en los síndromes medios ...

Un último consejo: si necesita seguridad, necesitará consultar a un experto real, no confíe en algunos tipos extraños (como yo) hablando en un foro. Somos aficionados.

Cuestiones relacionadas