如何加密文件并隐藏密码

How to encrypt a file and hide password

我们公司是卖汽车马达的。如果售出的电机坏了,我们希望客户(该电机的所有者)运行 我们的应用程序从电机读取数据并将其保存在文件中。我的工作是写这个应用程序。

我的问题是文件安全。如果文件以纯文本形式存储,客户端可以毫无问题地更改它,而我们不会意识到这一点(只有当客户端以物理方式向我们发送该电机并且我们 运行 时,我们才能真正知道该数据的真实性我们自己申请 - 这会花费时间和金钱)。所以我想我需要加密文件,也许使用 AES 加密。

现在(子)问题变成了如何存储加密密码。一点谷歌搜索告诉我它基本上不能以 100% 安全的方式完成。唯一可以使用的是混淆,比如白盒密码学。这是不安全的,我们的客户将有很大的动力去破解它。

所以现在我一直在努力寻找一些合适的解决方案。我想知道是否有更多来自 Whosebug 的知识渊博的人可以就如何解决我的问题向我提供建议。

您要从电机中提取什么数据?
OBD端口?
所有权?

如果您不希望您的代码被轻易逆转,
你可以考虑硬件
https://www.google.com/search?q=encryption+ic&tbs=qdr:y

为了更加安全,
我建议采用中间人方法;
他们向您发送数据(通过电子邮件等),
然后你有一个批处理,
在单独的 server/network
比较数据。
客户反馈以同样的方式返回。
客户永远不知道一切都保存在哪个 IP 网络上。

实现此目的的唯一安全方法是在受信任的环境中生成和签署数据。客户端 PC 上的应用程序 运行 通常不会 运行 在受信任的环境中。如果你可以信任电机(我猜它运行某种你可以与之通信的固件),电机应该生成并签署文件,你的应用程序应该简单地传递它。

顺便说一句:不要将加密与签名混淆。如果您加密一个文件,您可以确保没有其他人可以读取它,但不能保证不会被操纵。如果您签署一个文件,您就可以保护它免受操纵。如果你想要两者(防止操纵和防止未经授权的阅读),你必须加密和签名。加密和签名的逻辑有点相反:签名是用私钥完成的(任何拥有 public 密钥的人都可以进行验证)。加密是使用 public 密钥完成的(只有拥有私钥的人才能读取)。这也向您展示了您的信任问题:要进行签名,您必须将私钥(原文如此!)交付给您的客户。您需要采取措施防止提取此私钥。如果没有特殊硬件,这根本不可能。

另外:为每个 client/motor 创建一个不同的私钥。即使使用特殊硬件,也可能有人能够提取该密钥。如果所有电机都相同,那么所有电机的安全性都会被破坏。

正如其他朋友已经提到的,您将需要使用 2 个不同密钥进行加密和解密的非对称加密。因此,作为对称加密系统的 AES 无济于事。术语 "public" 和 "private" 是主观的,这意味着每个人都可能知道 public 密钥,但除了特殊的人之外没有人知道私钥。恕我直言,这些条款不适用于您的情况;根据您的应用程序,这两个密钥都是私有的。本项目我更喜欢称他们为"server"和"client"key,server指的是维修仆人,client是电机ECU。 您面临的主要问题是黑客可能通过下载 microcontroller/FPGA 固件来暴露客户端密钥。假设 RS232 连接用于固件 [up/down] 加载或升级,您需要防止未经授权的固件操作。在每次固件传输之前,您将不得不调查修改固件加载程序以使用一次性密码通过 RS232 进行身份验证的任务;认证的目的是识别一个授权的合法维护代理人。由于固件操作是在工厂完成的 - 使用直接有线连接 - 没有中间人攻击的风险。