генерирование безопасного хеш-кода для объектографа - PullRequest
2 голосов
/ 15 марта 2011

Я импортирую некоторые данные из файла (xls, csv, xml), что приведет к сложному графу объектов в памяти. Теперь мне нужно знать, был ли изменен этот график с момента его экспорта. Какой безопасный способ проверить это? Я полагаю, я экспортирую хеш-код с файлом? Если это так, будет ли достаточно стандартного способа генерации хеш-кода объекта ? Как мне создать хеш? Я бы предпочел генерировать хэш на графе объектов, а не на реальном потоке / файле.

Ответы [ 3 ]

2 голосов
/ 15 марта 2011

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

Если стандартные методы хеширования могут быть применены в значительной степени, зависит от того, что именно вы считаете "безопасным":вы просто хотите убедиться, что не было аппаратной ошибки при хранении / передаче данных или если вы хотите обнаружить простое изменение того, кто не знает, что он делает, это может быть хорошо - если вы убедились, что используетехорошая функция GetHashCode ().Если вы хотите защитить данные от «злоумышленников», я бы не стал полагаться на 32-битный «самодельный» хеш.(Особенно, если «злоумышленник» может знать код, например, в проектах с открытым исходным кодом).

В таких случаях я бы предпочел более сильные хеш-функции, такие как MD5 (не очень безопасные при столкновении) или лучше SHA-2 .Они работают с байтовыми потоками, которые вы должны хэшировать сами (XML и т. Д.) Или, возможно, сериализованные данные .net (что делает хеш независимым от формата данных вашего файла)..net предоставляет классы для этих алгоритмов, см. например http://msdn.microsoft.com/de-de/library/system.security.cryptography.hmacsha256.aspx

0 голосов
/ 18 июля 2011

Я закончил тем, что сделал следующее (что, кажется, работает довольно хорошо):

  1. создайте пользовательский целочисленный хеш-код, который включает все простые свойства одного объекта, используя этот алгоритм .
  2. повторение 1. для всех сложных объектов, на которые этот объект ссылается
  3. сериализует весь целочисленный хэш-код в один двоичный поток в хорошо известном порядке
  4. создает контрольную сумму MD5 этого потока
0 голосов
/ 19 марта 2011

Стандартным решением для вашей проблемы не является хеширование графика.Обычно вы просто отслеживаете, если / когда произошло изменение.

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

...