我正在设计一个表,该表将用于存储将向哪些客户收费的信息。
问题是数据库可能在客户的服务器上。
我在考虑添加第二个表,其中包含第一个表的散列,这样使用数据库的软件可以更新数据库和散列,但客户不能(在我们不知道的情况下)编辑包含收费信息的表(基于他们不能生成正确的散列)。
这是阻止客户篡改他们有权访问的表的好方法吗?
我如何创建表中所有数据的散列(可能不止一个表)?
具体地说,我需要对表中的数据进行哈希处理,而不是像dataset这样的对象(即,如果我们更改组件,我不希望所有的哈希都发生变化)。
我正在考虑将数据写入文本文件并创建文件的散列,但这将非常慢,因为表可能包含多达500,000条记录,并且每次更新时都需要生成散列!
它的实现可以用delphi或c#。
发布于 2010-03-02 23:46:20
为什么不在每个记录的基础上进行散列,而不是每个表呢?
您可以将一些字段连接在一起,填充为64个字符(使用特定字符或字符串),然后限制为64个字符并计算散列-将以下内容写入另一个表:
recordid tableid hash工作完成-足够简单的计算和足够容易的检查。
另外,如果一个随机的字符串只是浏览你的可执行文件(假设这里是delphi ),那么很难找到它们。
发布于 2010-03-02 03:14:21
散列是可行的,但是您还缺少另一个元素。为了生成不能重新生成的散列值,您需要在散列中包含一个保密值。GUID可以工作,但它可以是您的客户不知道的任何值。当然,如果他们的计算机上有软件,那么他们可以想见地发现算法和秘密值,从而绕过它。为每个客户使用不同的保密值将是一种很好的额外保护级别,以防一个客户发现它。
示例:
Hash([Table Data] + [Secret Value]) = [stored hash]如果您只对表数据进行散列,那么他们可以简单地重新散列修改后的表数据,然后您就不会知道他们已经这样做了。
至于如何散列整个表,而不是每一行,大多数散列都支持增量散列。原因是,如果您正在散列一个10 GB的文件,您可能没有足够的RAM将其全部加载到内存中进行处理。取而代之的是,您一次对一个块进行散列,然后当您完成时,您最终确定了散列。您可以对您的数据使用相同的方法。只需将每一行添加到散列中,一次添加一行,完成后即可完成散列。当然,记得包括你的密钥值。
以下是一些需要记住的事情:
还要记住,大多数人都是诚实的,许多人只有在诚实的道路太痛苦时才会采取规避措施(例如,测试中的假阳性,或者价格标签太贵)。通常情况下,那些想要偷窃它的人无论如何都不会付钱。今天可能偷窃的人,明天可能还钱。你不想和你的客户打架,把他们当作敌人,因为那样你们就都输了。
发布于 2010-03-02 02:01:41
我可能会从这个开始。它是如何在SQL Server中加密列的:
http://msdn.microsoft.com/en-us/library/ms179331.aspx
你将会遇到的问题是,在某个时间点,你将不得不解密它。因为它在他们的机器上,你用来验证信息的代码也在那里,它永远不会是真正的防篡改。他们可以查看您编译的代码,并找出如何绕过您现有的安全机制。
你还应该看看.Net http://msdn.microsoft.com/en-us/magazine/cc164058.aspx的代码混淆,它不会阻止他们,但会减慢他们的速度。
https://stackoverflow.com/questions/2357897
复制相似问题