2010-02-01 3 views
4

У меня есть программа C# и один файл, откуда он читает-пишет какую-то информацию. Мне нужно, чтобы пользователь не мог изменить содержимое этого файла, мне нужно каким-то образом понять, что этот файл правильный (не изменен пользователем). Пожалуйста, если у вас есть идеи, напишите, обсудите их вместе. Many ThanksC#, проверка правильной версии

+0

Что отличает от этого файла и его копия? контрольная сумма или crc или hash ?? или другой? –

ответ

2

Там нет абсолютно надежного способа добиться того, чего вы хотели. Если вы hash файл, пользователь может изменить файл и восстановить хеш, а затем ваша программа будет считать, что файл не модифицирован. Если вы попытаетесь скрыть хэш в реестре, пользователь может легко использовать инструменты SysInternals для определения местоположения, в котором вы его сохраняете.

Вы можете вместо этого цифровой знак файла, который похож на хэширование, за исключением того, что он включает в себя секретный ключ. Опять же, у вас есть проблема, что ключ должен храниться в секрете, а его хранение в приложении или где-то на компьютере оставляет возможность для пользователя найти ключ, а затем снова он может изменить файл и уйти в отставку. что эта модификация не обнаруживается вашей программой.

Возможно, ваше приложение отправило файл или, возможно, только хэш файла для повышения эффективности, к создаваемой веб-службе. Веб-служба может цифровой подписывать файл или хеш и возвращать подпись или хранить ее на сервере.Позже, когда приложение считывает файл, оно может использовать открытый ключ подписи и сервера (вы должны получить это с сервера, чтобы убедиться, что файл был подписан сервером), чтобы проверить, что файл не был изменен. Или вы можете повторно отправить файл или хэш на сервер, если сервер сохранил подпись, и он может проверить файл и вернуть результат в приложение. Опять же, это не является полным доказательством. Были бы способы для пользователя обманывать веб-сервис, даже если вы используете SSL, есть способы обойти это. Пользователь может полностью взломать ваше приложение и удалить проверочный код.

Судя по другим вопросам, это часть компонента системы активации программного обеспечения. Просто взгляните на Adobe и Microsoft, и их неудачные попытки создать такую ​​систему. Если вы думаете, что можете сделать лучше, удачи. Есть лучшие способы обеспечить, чтобы ваше программное обеспечение использовалось на законных основаниях без систем активации, которые приводят только к разочарованию ваших лояльных пользователей.

+0

Да, вы правы, я хочу сделать демо для своей программы. спасибо за ответ, и, пожалуйста, скажите лучше, я хочу, чтобы максимум разочаровал моих постоянных пользователей ... –

+0

пользователь скопировал файл, иногда работает с файлом, затем заменяет скопированный файл и работает с нуля. я не хочу это. в файле writeen info info ... –

+0

Что отличается от файла и его копии? контрольная сумма или crc или hash ?? или другой? –

0

Вы не можете ограничить пользователя в своей файловой системе, но ваше приложение может хранить параметры файла (созданный & измененные временные метки, размер) и создавать хеш на его содержимом, чтобы сравнить их с этими значениями перед следующим использованием файла.

Обновление.

Если вы хотите, чтобы пользователь не изменял файл, так или иначе, вы должны ограничить его доступ к нему, кроме чтения. Таким образом, у вас есть 2 альтернативы:

  1. Используйте гранты безопасности и удалите пользователя из ACL. Если пользователь является администратором, это плохая идея. В других случаях вам лучше определить некоторую группу пользователей, если это возможно.
  2. Используйте базу данных. Это может быть небольшая локальная БД, которую может модифицировать только продвинутый пользователь, например. SQLite. Но это работает только на предположении, что пользователь не может открыть этот файл (не может установить соответствующий инструмент ...)
+0

ОК, очень хорошо, вы меня понимаете на 100%. Но где сохранить этот хеш-результат? Я пытаюсь сохранить его в реестре> Но пользователь может скопировать этот результат хэша из реестра, и этот файл, работать некоторое время, а затем вставить файл и его хэш в реестр и работает с нуля. Я не хочу этого ... –

+0

Прочтите мой ответ. Это не работает для вас? – psychotik

+0

Ответ @Armen psychotik охватывает эту задачу – terR0Q

5

Compute файл checksum или crc или hash и записать его в самом файле (Compute хэш, прежде чем вы напишете хэш). Затем, когда вы загружаете файл, проверьте наличие этого хеша, удалите его и перечислите хэш. Убедитесь, что они совпадают. Если они этого не сделают, то это подделано. В любое время, когда вы сами меняете содержимое, обновляйте контрольную сумму/хэш.

+1

Просто имейте в виду, что пользователь сможет изменить файл и заменить хэш в файле впоследствии, чтобы предотвратить обнаружение модификации. – AaronLS

+0

Thaks, но, см. пользователь скопировать файл, иногда работает с файлом, затем заменяет скопированный файл и работает с нуля. я не хочу это. в файле writeen info info ... –

+0

Что отличает файл и его копия? контрольная сумма или crc или hash ?? или другой? –

0

Если вам просто нужно открыть файл в только для чтения в C#, вы можете сделать это specfiying флаг FileAccess.Read:

using (FileStream fs1 = new FileStream(path, FileMode.Open, FileAccess.Read)) 
{ 
    using (StreamReader rd1 = new StreamReader(fs1)) 
    { 
     while ((str = rd1.ReadLine()) != null) 
     { 
      //do stuff 
     } 
    } 
} 
0

Вы можете использовать хэш, чтобы гарантировать, что файл не изменился?

public static void Main(string[] args) 
{ 
    using (HashAlgorithm hashAlg = new SHA1Managed()) 
    { 
     using (Stream file = new FileStream("C:\\test.txt", FileMode.Open, FileAccess.Read)) 
     { 
      byte[] hash = hashAlg.ComputeHash(file); 
      Console.WriteLine(BitConverter.ToString(hash)); 
     } 
    } 
} 

или

BitConverter.ToString(MD5.Create().ComputeHash(File.ReadAllBytes("C:\\test.txt")))