使用 jar 签名作为一种许可证密钥
Posted
技术标签:
【中文标题】使用 jar 签名作为一种许可证密钥【英文标题】:Using jar signing as a kind of license key 【发布时间】:2011-08-05 23:58:11 【问题描述】:与this 问题相关,我可以/应该使用 jar 签名来创建一个防篡改 jar,其中嵌入了用于运行时强制执行允许使用该应用程序的用户数量的信息吗?我的想法是这样的:
-
创建包含包含正确数量用户的静态字段的单个类的 jar
对 jar 签名并放置在 Grails war lib 文件夹等类路径中
(假设,这是正确的吗?) 我可以从我的 grails 应用程序安全地访问已签名 jar 文件中的类中的静态字段,因为我知道 jar 没有被篡改(否则将出现异常抛出),也不需要任何额外的工作,比如“接受”签名。
我的第 3 步假设是否正确?这是我想要做的事情的好方法吗?如果不是,标准做法是什么?
谢谢!
【问题讨论】:
“我应该使用 jar 签名来创建防篡改 jar ..” 没有“防篡改”二进制文件。在这种情况下,如果您可以签名,那么黑客也可以。 【参考方案1】:如果用户必须在某些坚持签名存在且功能正常的环境中运行它,它只是“防篡改”。如果您将 jar 交给可以在普通 JVM 中运行它的普通人(不是作为小程序,也不是作为 webstart),他们可以完全删除签名。如果你想阻止这种情况,你必须编写代码来调用Class.getSigners
,如果你没有看到自己,就会爆炸。所以,他们需要启动 asm 来写出不存在的支票,这样就可以了。
Java 代码签名允许某些容器验证 jar 文件是否保持其源代码的完整性。它没有为您提供创建防篡改包的方法。
【讨论】:
【参考方案2】:简单的 JAR 签名不起作用。 JAR 签名是关于客户端信任您的 JAR 文件的全部内容。它不会阻止客户端从您的 JAR 内容(带有调整)创建新 JAR 并将其作为未签名的 JAR 运行。
您的 JAR 中的类可能会尝试检查它们是否从适当签名的 JAR 中加载,但可以调整任何此类类以禁用检查。所以这对于一个坚定的攻击者来说是一个减速带……但肯定不是一个不可行的解决方案。
对同时用户实施限制的常规方法是实施单独的许可证管理器/许可证密钥系统;例如弹性LM。 (当然,这也可以通过调整你的类来跳过许可证检查来解决。)
底线是,在您的客户端控制的机器上运行的代码的任何许可管理方案都可能被击败。
【讨论】:
谢谢@Stephen,这有助于我理解 当我在 Agilis link 从事许可证管理工作时,我想我会考虑一下有关许可证管理器安全性的评论。我建议我们的客户通过采取以下几种方法来防止试图跳过许可证检查的人:使用基于异常的控制流,使他们甚至很难找到在哪里进行许可证检查,执行许可证检查您的代码和操作阶段中的多个位置,需要定期进行许可证验证等。只需稍加思考和丰富经验,就可以使许可系统变得安全。以上是关于使用 jar 签名作为一种许可证密钥的主要内容,如果未能解决你的问题,请参考以下文章