加密 Seed/Algorithm 可以从编译代码中反向工程吗?

Can an Encryption Seed/Algorithm be Reverse-Engeered from Compiled Code?

我最近学习了很多关于加密的知识,我正在考虑在我的一些 Java 网络应用程序中使用它。我的想法是在客户端应用程序和服务器应用程序上安装一个伪随机数生成器,它们都会将相同的种子传递给该算法,以便它们生成相同的加密密钥。我的问题:如果有人对编译后的代码进行逆向工程,他们是否有可能找到算法 and/or 种子?如果是这样,有没有办法抵御这种情况?我用 java 开发,我看到的一些类似问题不是很具体。

总的来说,是的。但是你应该提供更多关于你的想法的信息,并阅读更多关于加密技术现状的信息。

如果您的种子总是相同的、硬编码的,伪随机数生成器将始终给出相同的数字序列,您的密钥将不安全。

算法通常是public,密钥与非对称技术共享(参见 Diffie-Hellman 作为介绍),然后在运行时生成对称密钥以加快消息加密速度。

所以你决定使用密码学。这是一个非常好的和有价值的第一见识,不能不被尊重。

理论上:是的。如果您的计算机可以执行它,那么它是确定性和有限的,因此可以检查代码的内部工作并进行逆向工程。

实践中:拆解一个简单的Hello World示例需要花费相当多的时间和精力。逆向工程更复杂的代码需要大量的时间、精力和知识。如果您的 "product" 不处理任何大量或有价值的信息,那么其他人就不太可能真正花时间尝试拆开它。

但是,由于您认为自己的信息非常有价值,因此想要对其​​进行加密,因此请始终假设其他人也会这样做 - 并且拥有所需的资源(时间、知识、and/or 金钱……)它。

几条建议:既然你显然开始研究密码学,你已经注意到它很难。而且更难做到正确。而且要确保它的安全性和弹性仍然更难。

  • 好的密码算法不需要混淆。即使它的所有内部工作原理都是众所周知和理解的,它也提供了可靠的安全性。 Security through obscurity 是初学者和 "experts" 中常见的误解。很多people/companies都掉进了这个圈套,通常损失惨重。

  • 密码学是全有或全无。如果你的代码中有一个小错误,你所有的加密信息实际上都不再是秘密了。如果你的随机数生成器有一个错误,你的加密只不过是包装礼物的纸……即使是像 OpenSSL 这样的著名库也总是需要大量的错误修复、维护和审查。

  • 不要发明你自己的密码学用于实时软件。你可以在纸上做它来学习,你可以实现一些例子来玩弄它。然而,设计、证明(数学)、实施我们当前使用的算法需要大量人员花费大量时间——这是有充分理由的。

  • 研究已知算法的现有实现,并尝试弄清楚它们是否得到良好维护和更新。学会理解它们并正确使用它们。 (常见错误 #2:程序员无法正确阅读和遵守库文档)

结论: 尝试使用密码学来感受一下。但是,请在 "real" 世界中使用完善的实现,除非你真的讨厌你的用户。处理密码 libraries/frameworks 已经够难的了。如果您愿意花大量的时间在它上面,请进入细节。

哦,还有逆向工程?别管那个了。如果你的攻击者想要这样做,他会的。但是如果你的安全实施很好,他根本不会从逆向工程中获益。