1

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

我们的一些二进制软件使用存储在源中的密码加密输出文件,看起来像随机字符。在软件层面,我们能够打开加密文件进行只读操作。如果有人真的想找出密码以便更改数据,这是可能的,但工作量很大。

我正在研究使用 Python 快速开发另一款软件。为了复制加密的功能来阻止/阻止数据篡改,到目前为止我想出的最好的想法是只使用ctypesDLL 进行文件读取/写入操作,这样加密和解密的方法就“足够”了混淆了。

我们很清楚,“无法破解”的方法是无法实现的,但与此同时,我显然不喜欢仅仅在 Python 源代码中以纯文本形式放置加密/解密方法。我认为,“非常强烈地阻止数据篡改”就足够了。

使用 Python 获得快乐的加密媒介或其他数据完整性证明的最佳方法是什么? 我看到另一篇关于生成“防篡改签名”的帖子,但如果签名是在纯 Python 中生成的,那么为任意数据生成签名将是微不足道的。我们或许可以打电话回家以证明数据的完整性,但这似乎给所有相关人员带来了极大的不便。

4

3 回答 3

12

作为一般原则,您不想使用加密来防止篡改,而是要使用数字签名。加密为您提供机密性,但您追求的是完整性

计算数据的哈希值,然后将哈希值存储在您知道它不会被篡改的地方,或者对其进行数字签名。

就您而言,您似乎想确保只有您的软件才能生成文件?就像您说的那样,当您的用户可以访问该软件时,不存在真正安全的方法来执行此操作,因为他们可以将其拆开并找到您包含的任何密钥。鉴于这种限制,我认为您使用 DLL 的想法与您能做到的一样好。

于 2009-07-24T16:46:22.247 回答
3

如果您在某处嵌入密码,那么您已经被淹没了。你不能保证什么。

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

它的工作方式是这样的:

  1. 您生成一个公钥/私钥对。
  2. 保持私钥安全,分发公钥。
  3. 散列数据,然后使用私钥对散列进行签名。
  4. 使用公钥来验证哈希。

这有效地将数据在您的公司之外呈现为只读,并为您的程序提供一种简单的方法来验证数据没有被修改而无需分发密码。

于 2009-07-24T16:45:37.333 回答
0

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

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

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

于 2009-07-27T15:37:28.100 回答