1

这个问题相关,我可以/应该使用 jar 签名来创建一个防篡改 jar,其中嵌入了用于运行时强制执行允许使用该应用程序的用户数量的信息吗?我的想法是这样的:

  1. 创建包含包含正确数量用户的静态字段的单个类的 jar
  2. 签署 jar 并将其放置在 Grails 战争 lib 文件夹中,等等类路径
  3. (假设,这是正确的吗?)我可以安全地从我的 grails 应用程序访问已签名 jar 文件中的类中的静态字段,知道 jar 没有被篡改(否则将引发异常),并且也没有任何需要额外的工作,例如“接受”签名。

我的第 3 步假设是否正确?这是我想要做的事情的好方法吗?如果不是,标准做法是什么?

谢谢!

4

2 回答 2

4

如果用户必须在某些坚持签名存在且功能正常的环境中运行它,它只是“防篡改”。如果您将 jar 交给可以在普通 JVM 中运行它的普通人(不是作为小程序,也不是作为 webstart),他们可以完全删除签名。如果你想阻止这种情况,Class.getSigners如果你没有看到自己,你必须编写代码来调用和爆炸。所以,他们需要启动 asm 来写出不存在的支票,他们会很高兴。

Java 代码签名允许某些容器验证 jar 文件是否保持其源的完整性。它没有为您提供创建防篡改包的方法。

于 2011-04-15T01:30:29.823 回答
2

简单的 JAR 签名不起作用。JAR 签名是关于客户端信任您的 JAR 文件的全部内容。它不会阻止客户端从您的 JAR 内容(带有调整)创建新 JAR 并将其作为未签名的 JAR 运行。

JAR 中的类可能会尝试检查它们是否从适当签名的 JAR 中加载,但可以调整任何此类以禁用检查。因此,对于一个坚定的攻击者来说,这是一个减速带……但肯定不是一个不可行的解决方案。

对同时用户实施限制的常规方法是实施单独的许可证管理器/许可证密钥系统;例如 FlexLM。(当然,这也可以通过调整你的课程来跳过许可证检查来解决。)

最重要的是,任何在您的客户端控制的机器上运行的代码的许可管理方案都可能被击败。

于 2011-04-15T01:32:38.283 回答