【问题标题】:C++: How to Encrypt XML Configuration FileC++:如何加密 XML 配置文件
【发布时间】:2011-07-04 18:12:00
【问题描述】:

我有一个使用 xml 配置的专有应用程序。目前我使用 boost::property_tree 来读取 xml 文件。

我想在更公共的系统上同时部署可执行文件和 xml 文件,并希望避免任何人(包括该系统的管理员)读取 xml。

理想情况下,我想在我的系统上维护明文 xml,以便我可以轻松地手动修改它。然后我会在文件上调用一些加密命令,将它部署在更公共的机器上,并让可执行文件即时解密它。我会使用相同的密钥并将其硬编码到可执行文件的源代码中。

这是一个合理的方法吗?实现这一点的最简单方法是什么?有没有更好的办法?

【问题讨论】:

  • 那里有你需要保护的东西吗?或者您只是不希望人们在文件中胡闹并寻求支持?如果是后一种情况,那么二进制序列化呢?
  • 这不是一个建设性的事情。一个足够坚定的系统管理员可以并且将会对您的应用程序进行逆向工程,找到密钥并解密配置文件。需要修改配置的不确定的人只会放弃您的应用程序。因此,你通过这些伎俩所做的一切,到头来都是在抢夺自己的市场份额。
  • 只要您意识到,由于应用程序需要保存解密密钥才能读取配置文件,因此加密充其量只是阻止偶然窥探者的一种手段,而不是一种合法的安全形式。
  • @Zack:使用公钥系统,管理员可以解密文件,但不能更改参数(不能加密修改后的文件)。从这个意义上说,效果会更接近于“签署”文件,并结合一种简单的隐匿安全形式。
  • 这只会让它更难一步(现在管理员必须修补二进制文件以接受不同的签名密钥)。

标签: c++ xml encryption configuration


【解决方案1】:

由于您已经在使用boost,因此您始终可以使用serialize it。如果您使用二进制存档,则该文件基本上是不可读的。我想我的后续问题是:您是否也希望它安全?还是只是不可读?

【讨论】:

  • 结果证明是最简单、更快的,满足我的需求。为了跨系统的可移植性,我使用了文本序列化而不是二进制,这意味着数字和文本仍然可读。
【解决方案2】:

如果代码在客户端机器上运行,那么原则上您永远无法阻止数据被知晓,因为它必须在客户端机器上。你可以尝试混淆,但最终客户端必须能够读取数据,所以它必须知道它。

如果您只是在程序中嵌入加密密钥,客户端只需扫描文件并提取密钥。如果你再努力一点,你可以做 Skype,但即使这样也已经被解构了。

这完全取决于您需要保护数据的严重性。如果它是绝对的,那么你不能这样做,但如果你只是想把临时访客拒之门外,你可以试着让它变得更难一些……如果你是认真的,请告诉我们一些细节。

【讨论】:

    【解决方案3】:

    如果您的目标是防止某人随意检查,那么这是一个合理的方法。

    如果你必须确保(出于某种奇怪的原因)配置不能被读取,这是一个愚蠢的差事,因为程序可以读取它,所以有决心这样做的用户也可以这样做。通过反汇编程序,或者简单地从调试器进行内存转储。话虽如此,一个简单、轻量级的加密就足够了,因为即使是最严格的加密也会以同样的方式被破解。

    如果您不希望人们阅读它,您还可以考虑使用 人类可读的 格式(例如 xml)是否非常适合。

    【讨论】:

      【解决方案4】:

      我有一个非常相似的案例。我使用压缩算法来存储“加密”文件。 zlib 可用于 C++。您可以从命令行和代码轻松加密和解密文件。要添加更多“安全性”,您可以使用密码对压缩文件进行异或运算。

      这既易于实现又易于使用。如果我的客户是黑客,或者有经济动机阅读 XML,我当然不会使用这种方法。

      【讨论】:

        猜你喜欢
        • 2011-01-10
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 2010-12-26
        • 2016-09-02
        • 2015-02-28
        相关资源
        最近更新 更多