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

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

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

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

使用 Python 实现加密或其他数据完整性证明的最佳方法是什么? 我看见 另一个帖子 谈论生成“防篡改签名”,但如果签名是用纯 Python 生成的,那么为任意数据生成签名将是微不足道的。我们 可能 能够打电话回家证明数据完整性,但这似乎给所有相关人员带来了很大的不便。

有帮助吗?

解决方案

作为一般原则,你不希望使用加密以防止篡改,而是要使用数字签名。加密使您的保密,但你以后的完整

计算哈希值在你的数据,要么散列值存储在你知道它不能被篡改或数字的地方签署。

在你的情况,好像你要确保只有您的软件可以有生成的文件?像你说的,也不可能存在一个真正安全的方式来做到这一点,当你的用户有机会获得软件,因为他们可以把它拆开,发现任何秘密密钥你有。鉴于约束,我想你使用DLL的想法是一样好,你可以做到这一点。

其他提示

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

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

它的工作方式是这样的:

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

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

这是另一个问题。据推测,数据采集软件收集数据从某些外部源(如某种测量装置的),然后做一切processsing是对原始数据必需和存储的结果。无论你在你的程序中使用什么方法,另一种可能的攻击媒介将是坏的资料提供给程序,而程序本身也没有办法知道你是在由数据,而不是数据反馈的,从测量出来设备。但是,这可能不是解决的。

另一个可能的攻击向量(也可能是一个你关心的是它已经被存储后,计算机上的数据篡改这里有一个想法,以降低风险:建立一个独立的服务器(。这可能是东西你公司将运行,或者更可能将它与一个密码保护的网络服务,它允许用户添加(但不删除)数据记录一些客户会成立)。然后让你的程序,当它收集的数据,将其发送到服务器(使用存储在该程序的密码/连接字符串)。让你的程序,只有当它接收到的数据已经成功存储在服务器上确认将数据写入到本地机器。

现在假设攻击者尝试与客户端上的数据篡改。如果他能逆向工程计划,然后他就可以,当然还是它发送到服务器进行存储,就如同程序一样。但是,服务器仍然会具有原始数据,因此篡改将检测的,因为该服务器将结束与原始和修改后的数据 - 客户端将无法抹去的原始记录。 (当然,客户端程序并不需要知道如何删除服务器上的记录。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top