忽略哲学和出口问题,我建议您最好直接加密表中的数据。
您需要混淆代码中的解密密钥。通常,这意味着将它们分解成碎片并以十六进制编码字符串并使用函数将密钥的碎片组装在一起。
对于算法,对于您使用的任何语言,我都会使用受信任的 AES 实现。也许这个适用于 C#:
http://msdn.microsoft.com/en-us/magazine/cc164055.aspx
最后,您需要了解该方法的局限性。也就是说,解密密钥是一个薄弱环节,它将在运行时以明文形式在内存中可用。(至少)必须是这样才能使用它。你的加密方案的实施是另一个弱点——任何缺陷都存在于你的代码中。正如其他几个人指出的那样,您的客户端-服务器通信也是可疑的。
您应该记住,您的可执行文件可以在十六进制编辑器中检查,其中明文字符串将从您编译的代码的随机垃圾中跳出来。并且许多语言(例如 C#)可以被反向编译,并且所有将缺少的只是注释。
话虽如此,加密您的数据将提高作弊的门槛。多少取决于你有多小心;但即便如此,一个坚定的对手仍然会破坏你的加密并作弊。此外,如果您的游戏很受欢迎,他们可能会编写一个工具来简化它;在这一点上给你留下一个军备竞赛的场景。
关于校验和值,假设您的数据库中有足够的数值来执行此操作,您可以根据一行中的值的总和来计算校验和。或者,对于一堆布尔值,您可以将它们存储在 varbinary 字段中,并使用按位排他运算符 ^ 来比较它们——您应该以 0 结尾。
例如,
对于数字列,
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