如何检索字节码并进行哈希处理以查看是否有人在内存或文件中操纵了我的字节码?
编辑: 对二进制文件进行签名是否可以保护代码不被修改和执行?尽管我想保护我的用户免于确保他们正在运行我的软件。我还想保护程序(服务器)不被黑客客户端使用。
如果有人篡改了我的客户端,我如何从服务器端检测到?
因此,您正试图阻止某些具有与您的应用程序相同(或更高)权限级别的进程操纵您的应用程序?
这是一项注定要失败的任务。因为如果您添加安全检查,什么会阻止攻击者isSecure()
通过将其替换为简单的方法来修改您的方法return true;
?
我认为您需要澄清您的要求(至少我无法理解您在寻找什么)。
在与安全相关的领域,您总是需要回答两个问题,然后才能开始解决问题:
在您的情况下,我相信您正在尝试保护 Java 客户端的类文件不被修改。在这种情况下,答案取决于(潜在的)攻击者可以做什么。
如果攻击者实际上在客户端运行的机器上拥有管理员权限,那么您基本上无能为力。正如上面 saua 所指出的,如果您不能信任正在运行的系统,那么您注定要失败。
如果攻击者只能在类文件到达客户端之前修改它们,那么签署您的 JAR 文件将使您的客户端检测到该操作。
也许您想对jar 文件进行签名?
通过添加自定义 Transformer,您应该可以通过 Intrumentation 实现您想要的。见http://java.sun.com/j2se/1.5.0/docs/api/java/lang/instrument/package-summary.html
自定义类加载器也可以完成这项工作,因为它在定义类时获取字节码。
您可以创建自己的类加载器并手动进行检查,或者您可以签署您的代码并让 java 运行时为您完成这项工作。
签署 jars 将保护代码不被修改。签名涉及根据您的私钥创建签名。公钥嵌入到带有这些签名的 jar 中。Java 将根据您的公钥验证签名并拒绝加载修改后的类。
被黑客入侵的客户端将更难预防。首先,被攻击者必须对您的协议进行逆向工程。您可以使用 java 混淆器采取措施防止这种情况发生,但最终攻击者可以只监视线路并从流量中对协议进行逆向工程。即使您加密客户端-服务器通信(这并不容易,考虑使用已经为您完成的协议...... SSH 或 HTTPS),您最终仍然容易受到中间人攻击.
你到底想保护什么?
在客户端,您可以使用 jar 中类文件的路径名调用 getResourceAsStream。
这回答了您问题的一部分(“我如何检索字节码”)。其他答案很好地涵盖了更大的问题。