Игнорируя философские и экспортные проблемы, я бы посоветовал вам лучше зашифровать данные в таблице напрямую.
Вам необходимо скрыть ключи дешифрования в вашем коде. Как правило, это означает разбивать их на части и кодировать строки в шестнадцатеричном формате и использовать функции для сборки частей ключа.
Для этого алгоритма я бы использовал надежную реализацию AES для любого языка, который вы используете.
Может быть, это для C #:
http://msdn.microsoft.com/en-us/magazine/cc164055.aspx
Наконец, вам нужно знать об ограничениях подхода. А именно, ключ дешифрования является слабым звеном, он будет доступен в памяти во время выполнения в виде открытого текста. (Как минимум) Это должно быть так, чтобы вы могли использовать его. Внедрение вашей схемы шифрования является еще одним недостатком - любые недостатки также содержат недостатки в вашем коде. Как отметили несколько других людей, ваши клиент-серверные связи также подозрительны.
Вы должны помнить, что ваш исполняемый файл может быть проверен в шестнадцатеричном редакторе, где строки открытого текста выпрыгнут из случайного мусора, который является вашим скомпилированным кодом. И что многие языки (например, C #) могут быть скомпилированы в обратном порядке, и все, что будет отсутствовать - это комментарии.
Все это говорит о том, что шифрование ваших данных немного поднимет планку обмана. Как много зависит от того, насколько вы осторожны; но даже в этом случае решительный противник все еще сломает ваше шифрование и обман. Кроме того, они, вероятно, напишут инструмент, который облегчит вашу игру; оставив вам сценарий гонки вооружений на этом этапе.
Что касается значения контрольной суммы, вы можете вычислить контрольную сумму на основе суммы значений в строке, предполагая, что в вашей базе данных достаточно числовых значений для этого. Или, для множества логических значений, вы можете сохранить их в поле varbinary и использовать побитовый исключительный оператор ^ для их сравнения - вы должны получить 0s.
Например,
для числовых столбцов,
2 | 3 | 5 | 7 | со столбцом контрольной суммы | 17 |
для логических значений,
0 | 1 | 0 | 1 | со столбцом контрольной суммы | 0101 |
Если вы сделаете это, вы даже можете добавить итоговую строку в конце, которая суммирует ваши контрольные суммы. Хотя это может быть проблематично, если вы постоянно добавляете новые записи. Вы также можете конвертировать строки в их компоненты ANSI / UNICODE и суммировать их тоже.
Затем, когда вы хотите проверить контрольную сумму, просто сделайте выбор следующим образом:
Select *
FROM OrigTable
right outer join
(select pk, (col1 + col2 + col3) as OnTheFlyChecksum, PreComputedChecksum from OrigTable) OT on OrigTable.pk = OT.pk
where OT.OnTheFlyChecksum = OT.PreComputedChecksum