Хеширование будет работать, но есть еще один элемент, который вам не хватает. Чтобы создать хеш-значение, которое не может быть восстановлено, вам необходимо включить в хеш секретное значение . GUID будет работать, но это может быть любая ценность, которую ваш клиент не знает. Конечно, если у них есть программное обеспечение на их компьютере, то они могли бы обнаружить алгоритм и секретную ценность, таким образом обойдя его. Использование разных секретных значений для каждого клиента было бы хорошим дополнительным уровнем защиты на случай, если один клиент обнаружит его.
Пример:
Hash([Table Data] + [Secret Value]) = [stored hash]
Если вы делаете только хэш данных таблицы, они могут просто перефразировать измененные данные таблицы, и тогда вы не узнаете, что они это сделали.
Что касается хэширования всей таблицы, то вместо каждой строки большинство хэшей поддерживают добавочное хеширование. Причина в том, что если вы хэшируете файл размером 10 ГБ, вам, вероятно, не хватает оперативной памяти, чтобы загрузить все это в память для работы. Вместо этого вы хешируете один блок за раз, а затем, когда вы закончите, вы завершаете хеш. Вы можете использовать этот же метод для ваших данных. Просто добавьте каждую строку в хэш, по одному, и когда вы закончите, завершите хэш. Конечно, не забудьте указать значение вашего секретного ключа.
Некоторые вещи, которые следует иметь в виду:
- Не включайте процедуру проверки в ваше приложение - другими словами, не предоставьте им способ проверить, что их попытка взлома сработала или не удалась. Это даст им немедленную обратную связь и позволит им разработать окончательное решение.
- Убедитесь, что вы хорошо протестировали эту систему, особенно если вы планируете наказать клиента в случае сбоя этих хэшей.
- Убедитесь, что ваш клиент знает, что вмешательство в эти значения запрещено. Возможно, было бы неплохо объединить его с шифрованием на уровне таблицы, чтобы предотвратить случайные изменения.
- Возможно, лучше зарегистрировать платежи за пределами сайта. Если сервер подключен к Интернету, отправьте информацию в запущенный веб-сервис. Для еще большей безопасности веб-служба проверяет сообщения и отвечает ключом. Затем вы можете проверить этот ключ локально, чтобы убедиться, что он не обошел веб-сервис. Это было бы отличным приложением для подписи открытого ключа.
Также имейте в виду, что большинство людей честны, и многие люди будут прибегать к обходу, если путь честности слишком болезнен (то есть ложные срабатывания на тестах или слишком дорогой ценник). Часто те, украл бы это не заплатит за это так или иначе. Другие, которые могут украсть сегодня, могут заплатить завтра. Вы не хотите сражаться со своими клиентами и относиться к ним как к своему врагу, потому что тогда вы оба проиграете.