【问题标题】:offline security in .NET applocation storing Obfuscated Key inside the code.NET 应用程序中的离线安全性在代码中存储混淆密钥
【发布时间】:2012-02-03 14:21:32
【问题描述】:

我正在开发一个无法连接到互联网的 C# 应用程序。

这个应用程序将为我的硬件生成一个配置文件。

我想确定的是,当我将配置文件提供给我的助手时,他并没有更改它,而是在硬件中放入了一个具有不同配置的文件。

为了避免这种情况,我目前正在使用一种简单的方法。

  1. 在代码中我有一个键:abcd123

  2. 我的应用程序生成一个配置文件,然后:

  3. HASH 配置文件并使用 KEY:abcd123 加密 HASH 存储在 字符串变量KEY

  4. 将配置文件交给我的助手,助手将其加载到硬件中

现在,硬件拥有密钥 abcd123,它解密配置并对有效负载进行哈希处理。如果 2 HASH 相同,我假设我的助手没有更改配置文件。

我担心的是,.NET 代码中的 KEY 存储很容易恢复,无需混淆。

我因此购买了Crypto Obfuscator,但我不知道我的密钥有多安全。

我不够熟练,无法反编译我的程序并查看密钥是否仍然清晰。

您可以建议我使用哪些方法来合理地确保我的密钥是“安全的”?

我知道没有办法保护它,但我只想为我不太了解的自动混淆提供合理的额外安全性。

我希望我已经清楚了,但要求澄清。

【问题讨论】:

  • 假设您在网络上,您可以通过联网 PC 上的 Web 服务进行身份验证。
  • 我的应用程序在从未连接到网络的离线计算机上运行,​​我无法通过任何方式将其连接到互联网。

标签: c# .net security cryptography obfuscation


【解决方案1】:

我想确定的是,当我将配置文件提供给我的助手时,他并没有更改它,而是在硬件中放入了一个具有不同配置的文件。

您正在寻找一种数字签名算法。一般来说,有两种方法可以做到这一点:

  • 使用计算可靠加密哈希的对称算法(例如 SHA-2)。您发布哈希和相应的文件。硬件获取文件,使用相同的算法计算散列并断言它与公开发布的散列相同。看看 Apache log4net 如何提供库和匹配的签名。

  • 另一种方法是使用公私密钥签名,例如 RSA。 msdn 提供了一个示例,其中展示了如何使用 RSACryptoServiceProvider 对 XML 文档进行签名。您可以创建一个私钥-公钥对。私钥用于创建数字签名,您自己保管。使用公钥,您只能验证签名,这就是您部署到设备的内容。

来自上述链接的另一个安全提示:

切勿将非对称密钥对的私钥存储或转移到 纯文本。永远不要将私钥直接嵌入到您的 源代码。嵌入的密钥可以很容易地从程序集中读取 Ildasm.exe(MSIL 反汇编程序)或通过在 记事本等文本编辑器。

【讨论】:

  • 问题是我不能上网。因此,我无法发布 HASH 或检索它。整个程序和硬件在没有任何类型的 Internet 连接的位置运行。
  • 不需要私钥验证,需要公钥。
  • @NoobTom 请查看更新后的第二个选项,我第一次没有正确放置。
  • 你是对的,问题是我不确定我是否可以在硬件上运行 RSA,因为处理器大约是 80 MHZ。我必须检查一下。但是谢谢你的回答是正确的
【解决方案2】:

只有不将密钥放入代码中,才能获得真正的安全性。

一种方法是使用公钥加密(例如 RSA)。

您创建一个公钥和一个私钥。私钥永远不会离开您的系统。

您使用私钥对配置文件进行签名。

硬件上运行的软件包含公钥,并使用它来验证配置文件的签名,而无需任何网络连接。

即使全世界都知道你的公钥,没有私钥(只有你可以使用),没有人可以创建有效的签名。

【讨论】:

  • 你们是对的,问题是我不知道内部硬件是否可以在适当的时间内运行 RSA,因为我认为它是 100 MHZ 处理器,我必须仔细检查它。
猜你喜欢
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
相关资源
最近更新 更多