防止SQL数据库中的数据欺诈和删除

防止SQL数据库中的数据欺诈和删除,sql,sql-server,security,fraud-prevention,Sql,Sql Server,Security,Fraud Prevention,我们有一个应用程序,为许多客户端安装在本地。我们正在努力收集将来某个时候将发送给我们的信息。我们希望确保能够检测到我们的任何数据是否被修改,以及是否有任何数据被删除 为了防止数据被修改,我们当前使用哈希表行,并随数据一起发送哈希。然而,我们正在努力检测数据是否已被删除。例如,如果我们在一个表中插入10条记录,并对每一行进行散列,用户将无法在我们未检测到的情况下修改该记录,但如果他们删除所有记录,则我们无法将其与初始安装区分开来 限制条件: 客户端将具有数据库的管理员角色 应用程序和数据库将位于

我们有一个应用程序,为许多客户端安装在本地。我们正在努力收集将来某个时候将发送给我们的信息。我们希望确保能够检测到我们的任何数据是否被修改,以及是否有任何数据被删除

为了防止数据被修改,我们当前使用哈希表行,并随数据一起发送哈希。然而,我们正在努力检测数据是否已被删除。例如,如果我们在一个表中插入10条记录,并对每一行进行散列,用户将无法在我们未检测到的情况下修改该记录,但如果他们删除所有记录,则我们无法将其与初始安装区分开来

限制条件:

  • 客户端将具有数据库的管理员角色
  • 应用程序和数据库将位于DMZ后面,无法连接外部服务
  • 客户端将能够分析任何sql命令,并能够复制我们所做的任何初始设置。(要清除它们,客户端还可以删除/重新创建表)
  • 尽管客户机可以删除数据和表,但在审计过程中,如果删除或删除某些数据和表,我们会很明显看到它们,因为它们总是在积累数据,丢失的数据或截断的数据会很突出。我们希望能够检测其余表中的删除和欺诈
  • 我们的工作假设客户机本身无法反转代码库或散列/加密数据
  • 客户将每月向我们发送所有收集的数据,我们将每年对系统进行一次审核
  • 还考虑到客户机可以在“好”状态下备份VM的DB或快照,然后如果他们想要销毁数据,则回滚到“好”状态。我们不想直接检测vm快照或db备份回滚
到目前为止,我们唯一的解决方案是加密安装日期(可以修改)和实例名称。然后每分钟“增加”加密数据。当我们向系统添加数据时,我们散列数据行,并将散列粘贴到加密数据中。然后继续“增加”数据。然后,当每月发送数据时,我们将能够看到他们是否正在删除数据并在安装后将DB回滚到,因为加密值不会有任何增量,或者会有不属于任何数据的额外哈希

谢谢

假设您的代码中有一个md5()或类似的函数,您希望控制表“table1”中“id”字段的修改。您可以执行以下操作:

accumulatedIds = "secretkey-only-in-your-program";
for every record "record" in the table "table1"
  accumulatedIds = accumulatedIds + "." + record.id;

update hash_control set hash = md5(accumulatedIds) where table = "table1";
每次授权更改表“表1”中的信息后。没有人能在不被注意的情况下改变这个系统

如果有人更改了一些id,您会注意到这一点,因为散列不一样

如果有人想重新创建您的表,除非他重新创建完全相同的信息,否则他将无法再次创建哈希,因为他不知道“仅在您的程序中使用secretkey”

如果有人删除了一条记录,它也可以被发现,因为“累计ID”不匹配。如果有人添加记录,同样的情况也会发生

用户可以删除表hash_控件下的记录,但如果没有“secretkey…”,他无法正确地重建哈希信息,因此您也会注意到这一点


我遗漏了什么???你查过了吗?如果这种方式的性能足够好,则可以将一次写入介质用作辅助存储。这将保证事务的完整性,即使是针对DB或OS管理员。我不确定使用真正的write once介质进行事件寻源是否可行,并且仍然保持合理的性能。

否,因为如果他们删除表并重新创建,那么数据将被删除,感谢您的帮助answer@DavidWork,我对我的答案作了重大修改。请检查一下。谢谢你的更新。这肯定涵盖了我们想要检测的更多内容。我非常喜欢它的一点是,应用程序实际上可以删除记录并在hash_控制表中重新创建hash,而不是只进行软删除。我们还可以知道删除了哪些/多少行。继续。至于缺少的内容,它仍然容易受到客户端捕获“table1”和“hash_control”表的攻击,这些表的状态对它们来说是“好”的,并不断回滚到该状态。如果表1中有正在运行的作业,并且我们想知道作业的运行状态,那么它们可以捕获正在运行的5个作业的状态,然后在完成后回滚到5个作业,运行任意数量的作业。由于应用程序的其他部分被假定为持续运行,因此我们认为需要在您建议的基础上添加一个基于时间的元素和事件源。再次感谢,这非常有用,我们也在考虑转移到概率模型,而不是确定性模型,因为提供欺诈发生的估计比布尔是/否更可靠。事件来源可能是我们探索的一条路线。还有一些事情是它无法阻止的,比如用户回滚到他们认为有利于销毁/隐藏事件的状态。或者,如果他们能够剪掉事件,并将系统置于另一种状态,这也会破坏目的,但我希望事件来源系统能够防止挑选或删除单个事件。事件源系统似乎可以防止用户仅仅截取事件事件,事件源系统必须解决许多我们正试图解决的问题now@DavidWork这就是为什么在最简单的情况下,我提到像DVD这样的一次性写入介质,在适当的时间间隔内,可以写入事件的当前快照。如果没有人能够改变过去,那么最好的选择就是摧毁媒体,但那将是欺诈的证据。请注意,有一位教授