忽略哲学和出口问题,我建议您最好直接加密表中的数据。
您需要在代码中混淆解密密钥。通常,这意味着将它们分成几部分,并使用十六进制编码字符串并使用函数将密钥的各个部分组装在一起。
对于算法,我建议使用您所使用语言的可信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 命令:
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