使用JAR签名作为一种许可的关键

问题描述:

相关this问题,可以/我应该使用JAR签名创建具有信息防篡改罐子嵌入式用户数量的运行时执行允许使用的应用程序?我的想法是这样的:使用JAR签名作为一种许可的关键

  1. 创建包含静态字段持有用户的权数
  2. 登录Grails的战争lib文件夹中的jar和地点单个类的jar等类路径
  3. (假设是这个正确吗?)我可以安全地从我的grails应用程序中访问签名jar文件中的类的静态字段,因为它知道该jar没有被篡改(否则会引发异常),并且不需要任何额外的工作。 “接受”签名。

是我第3步假设是正确的?这是我尝试做的一个好方法吗?如果不是,标准做法是什么?

谢谢!

+0

“我应该使用jar签名来创建一个防篡改jar吗?”没有这样的东西作为'防篡改'的二进制文件。在这种情况下,如果你可以签名,黑客也可以。 – 2011-04-15 01:16:25

这只是“防篡改”如果用户在一些坚持认为签名是存在和功能的环境中运行它。如果你把一个罐子交给一个可以在普通的JVM上运行的普通人(不是一个applet,而不是一个webstart),他们可以完全删除签名。如果你想试图阻止这种情况发生,你必须编写代码来呼叫Class.getSigners,如果你没有看到自己,就会爆炸。所以,他们需要启动asm写这个检查存在,他们会很好去。

Java代码签名允许一些容器来验证jar文件从源头上保持完整性。它并没有给你一个创建防篡改包的方法。

+0

明白了,感谢你在这里的支持,因为我大声思考。 – 2011-04-15 01:53:01

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

类在JAR可以尝试检查,他们是从合适的签名JAR加载,但任何这样的类可以进行调整以禁用检查。所以对于一个坚定的攻击者来说这是一个速度缓冲......但肯定不是一个不可行的解决方案。

执行关于用户同时限制了正常的方式是实现一个单独的许可证管理器/许可密钥系统;例如的FlexLM。 (当然,这也可以通过调整你的课程来跳过许可证检查而被击败。)

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

+0

谢谢@Stephen,这有助于我的理解 – 2011-04-15 01:54:08

+1

当我在Agilis [链接](http://www.agilis-sw.com)的许可管理工作时,我认为我会考虑有关许可经理安全性的评论。我建议我们的客户采取以下几种方法来防止尝试跳过许可证检查的人员:使用基于异常的控制流程使他们难以找出执行许可证检查的位置,执行许可证检查在您的代码和操作阶段的几个地方,需要定期进行许可证验证等。通过一些想法和许多经验,许可证系统可以变得安全。 – Dominic 2011-05-20 18:17:26