防篡改表

Jam*_*ass 3 c# sql-server delphi hash

我正在设计一个用于存储客户收费信息的表格.
问题是数据库可能在客户服务器上.
我正在考虑添加第二个包含第一个哈希的表,以便使用数据库的软件可以更新数据库和哈希,但是客户无法编辑(我们不知道)包含收费信息的表(在他们无法生成正确哈希的基础).

这是阻止客户篡改他们可以访问的表的好方法吗?
如何创建表中所有数据的哈希值(可能多于一个表)?

具体来说,我需要在表中散列数据而不是像数据集这样的对象(即,如果我们更改组件,我不希望所有哈希都改变).

我正在考虑将数据写入文本文件并创建文件的哈希值,但这会非常缓慢,因为表可能包含多达500,000条记录,并且需要在每次更新时生成哈希值!

这可以在delphi或c#中实现.

Jim*_*eth 10

散列可行,但还有另一个元素缺失.为了生成无法重新生成的哈希值,您需要在哈希中包含一个秘密值.GUID可以工作,但它确实可以是您的客户不知道的任何价值.当然,如果他们的计算机上有软件,那么他们可以想象地发现算法和秘密值,从而规避它.对于每个客户使用不同的秘密值将是一个很好的额外保护级别,以防一个客户发现它.

例:

Hash([Table Data] + [Secret Value]) = [stored hash]
Run Code Online (Sandbox Code Playgroud)

如果你只对表数据进行哈希处理,那么他们可以简单地重新修改已修改的表数据,然后你就不会知道他们已经完成了.

至于如何散列整个表,而不是每一行,大多数散列支持增量散列.原因是如果您正在对10 GB文件进行哈希处理,则可能没有足够的RAM将其全部加载到内存中以进行处理.相反,您一次散列一个块,然后在完成后最终确定散列.您可以对数据使用相同的方法.只需将每一行添加到散列中,一次添加一行,并在完成散列后完成.当然记得要包含你的密钥值.

要注意的一些事项:

  1. 不要在您的应用程序中包含验证例程 - 换句话说,不要为他们提供验证他们的尝试黑客工作或失败的方法.这样做将为他们提供即时反馈,并允许他们设计最终解决方案.
  2. 确保您对此系统进行了良好的测试,特别是如果您计划在这些哈希失败时惩罚您的客户.
  3. 确保客户知道禁止篡改这些值.将它与表级加密结合起来以防止意外修改可能是个好主意.
  4. 你可能最好不要在网站上记录这些费用.如果服务器已连接到Internet,则将其发送到您运行的Web服务.为了更好的安全性,Web服务验证消息并使用密钥进行响应.然后,您可以在本地验证该密钥,以确保它们没有绕过Web服务.这将是公钥消息签名的一个很好的应用.

还要记住,大多数人都是诚实的,如果诚实的道路太痛苦(例如测试中的误报,或价格太昂贵),很多人只会诉诸规避.通常是那些会偷走它的人无论如何都不会为此付出代价.今天可能偷的其他人明天可能会付钱.你不想与客户作战,把它们视为你的敌人,因为那时你们都松了.