Python: 加密作为防止数据篡改的手段
我们公司的很多客户在研究中使用我们的数据采集软件。由于研究的特殊性,一些客户要求对数据进行加密,以防止数据被篡改——如果他们的数据被证明是伪造的,后果可能会很严重。
我们的一些二进制软件会用存储在源代码中的密码对输出文件进行加密,这个密码看起来像是随机字符。在软件层面上,我们可以打开加密文件进行只读操作。如果有人真的想要找到密码以便修改数据,虽然是有可能的,但这会非常麻烦。
我正在考虑使用Python快速开发另一款软件。为了实现加密功能,以防止或减少数据篡改,我目前想到的最好办法是使用ctypes
和一个DLL来进行文件的读写操作,这样加密和解密的方法就会“足够”隐蔽。
我们很清楚没有“无懈可击”的方法,但我显然不想让加密和解密的方式直接暴露在Python源代码中。我认为“强烈阻止数据篡改”就已经足够了。
用Python实现一种适度的加密或其他数据完整性证明的最佳方法是什么? 我看到过另一篇帖子提到生成“防篡改签名”,但如果签名是在纯Python中生成的,那么为任何任意数据生成签名就会变得很简单。我们可能能够通过网络验证数据完整性,但这对所有人来说似乎都是一种重大不便。
3 个回答
这里还有一个问题。可以推测,你的数据采集软件是从某个外部来源(比如某种测量设备)收集数据,然后对这些原始数据进行必要的处理并存储结果。不管你在程序中使用什么方法,另一个可能的攻击方式就是向程序输入错误的数据,而程序本身无法判断你输入的是虚假的数据还是来自测量设备的数据。不过,这个问题可能无法解决。
另一个可能的攻击方式(可能也是你最关心的)是对存储在电脑上的数据进行篡改。为了降低这种风险,可以考虑这样做:设置一个独立的服务器(这可以是你们公司运行的,或者更可能是客户自己设置的),并提供一个需要密码保护的网络服务,允许用户添加(但不能删除)数据记录。然后,当你的程序收集到数据时,就把数据发送到这个服务器(使用存储在程序中的密码/连接字符串)。只有在确认数据成功存储在服务器上后,程序才会将数据写入本地机器。
现在假设攻击者试图篡改客户端的数据。如果他能逆向工程这个程序,那么他当然可以像程序一样将数据发送到服务器进行存储。但是服务器仍然会保留原始数据,因此篡改是可以被检测到的,因为服务器会同时拥有原始数据和修改后的数据——客户端无法删除原始记录。(客户端程序当然不需要知道如何在服务器上删除记录。)
如果你在某个地方嵌入了密码,那你就麻烦大了。你根本无法保证安全。
不过,你可以使用公钥/私钥加密来确保数据没有被篡改。
它的工作原理是这样的:
- 你生成一对公钥和私钥。
- 把私钥保管好,公钥可以分发出去。
- 对数据进行哈希处理,然后用私钥对哈希值进行签名。
- 使用公钥来验证哈希值。
这样一来,数据在你公司外部就变成了只读的,并且你的程序可以简单地验证数据没有被修改,而不需要分发密码。
一般来说,你不应该用加密来防止数据被篡改,而是应该使用数字签名。加密主要是为了保护数据的机密性,而你需要的是确保数据的完整性。
你可以对你的数据计算一个哈希值,然后把这个哈希值存放在一个你知道不会被篡改的地方,或者给它数字签名。
在你的情况下,似乎你想确保只有你的软件能生成这些文件?正如你所说的,当用户可以访问你的软件时,就没有一种真正安全的方法来做到这一点,因为他们可以拆解软件,找到你包含的任何秘密密钥。在这种情况下,我觉得你使用DLL的想法是你能做到的最好选择。