Python:加密作为防止数据篡改的手段

时间:2009-07-24 16:39:15

标签: python encryption data-integrity tampering

我公司的许多客户都在研究基础上使用我们的数据采集软件。由于一般研究的性质,一些客户要求加密数据以防止篡改 - 如果他们的数据被证明是伪造的,可能会有严重的后果。

我们的一些二进制软件使用存储在源中的密码加密输出文件,该密码看起来像随机字符。在软件级别,我们可以打开加密文件以进行只读操作。如果某人真的想要找出密码以便他们可以改变数据,那么这是可能的,但这将是很多工作。

我正在研究使用Python来快速开发另一个软件。要复制加密功能以阻止/阻止数据篡改,我到目前为止提出的最好的想法是使用ctypes和DLL进行文件读/写操作,这样加密方法和解密被“充分”混淆了。

我们清楚地意识到“无法破解”的方法是无法实现的,但与此同时,我显然不满意只使用加密/解密方法在Python源代码中以纯文本形式存在。我认为,“非常强烈的数据篡改劝阻”已经足够好了。

使用Python获得加密或其他数据完整性证明的最佳方法是什么?我看到another post谈论生成“防篡改签名”,但是如果签名是在纯Python中生成的,那么为任意数据生成签名都是微不足道的。我们可能能够通过电话回家来证明数据的完整性,但这对所有参与者来说都是一个很大的不便。

3 个答案:

答案 0 :(得分:12)

作为一般原则,您不希望使用加密来防止篡改,而是希望使用数字签名。加密为您提供机密性,但您仍然在完整性之后。

计算数据的哈希值,并将哈希值存储在您知道无法对其进行篡改或对其进行数字签名的位置。

在您的情况下,您似乎想确保只有您的软件才能生成文件?就像你说的那样,当你的用户可以访问软件时,就不可能有一种非常安全的方法来实现这一点,因为他们可以将它拆开并找到你所包含的任何密钥。鉴于这种约束,我认为您使用DLL的想法与您可以做到的一样好。

答案 1 :(得分:3)

如果你在某处嵌入密码,那么你已经被软管了。你无法保证任何事情。

但是,您可以使用公钥/私钥加密来确保数据未被篡改。

它的工作方式是:

  1. 您生成公钥/私钥对。
  2. 保持私钥安全,分发公钥。
  3. 散列数据,然后使用私钥对散列进行签名。
  4. 使用公钥验证哈希值。
  5. 这有效地将数据呈现为公司外部的只读数据,并为您的程序提供了一种简单的方法来验证数据是否未在不分发密码的情况下进行修改。

答案 2 :(得分:0)

这是另一个问题。据推测,您的数据采集软件正在从一些外部源(如某种测量设备)收集数据,然后对原始数据进行必要的处理并存储结果。无论您在程序中使用何种方法,另一种可能的攻击向量都是将错误的数据输入程序,程序本身无法知道您是在输入补偿数据而不是来自测量的数据设备。但这可能无法解决。

另一种可能的攻击媒介(可能是你关注的那个是在存储后篡改计算机上的数据。这是一个降低风险的想法:设置一个单独的服务器(这可能是你的公司会运行,或者更有可能是客户端设置的东西),使用受密码保护的Web服务,允许用户添加(但不删除)数据记录。然后让您的程序在收集数据时将其发送给服务器(使用存储在程序中的密码/连接字符串)。如果程序收到数据已成功存储在服务器上的确认,则程序只将数据写入本地计算机。

现在假设攻击者试图篡改客户端上的数据。如果他可以对程序进行逆向工程,那么他当然可以将其发送到服务器进行存储,就像程序一样。但是服务器仍然会有原始数据,因此篡改将是可检测的,因为服务器最终会同时包含原始数据和修改后的数据 - 客户端将无法擦除原始记录。 (客户端程序当然不需要知道如何擦除服务器上的记录。)