如何控制自定义jar库的使用?

时间:2011-08-29 19:23:50

标签: java android

我需要一种基本上保护我的jar库的方法,以允许已注册的应用程序在他们的项目中使用它,并拒绝使用未经我批准的应用程序。

如果我在lib中对每个发行版进行硬编码,那就没问题了。我目前对这个罐子进行了混淆。

限制使用jar的好方法是什么?

一个想法是将lib锁定到特定的包,因此如果开发人员试图在另一个项目中使用它,则不能。但我不确定他们是否可以轻松提供自定义假上下文以使其正常工作......

3 个答案:

答案 0 :(得分:2)

对我来说,如果您希望您的库保持独立(不涉及网络检查或下载库的部分,我的意思是),最好的方法是强制使用将接收令牌的初始化程序类来自客户端应用程序。

这将是可以破解的,因为令牌有效性测试将由你的lib执行:一个人可能会以某种方式修改lib只会跳过该测试,但这会因混淆而变得更难。但这可能就足够了,除非在没有注册的情况下使用你的lib是一个非常关键的问题。

  • 所以你会有类似的东西:

    boolean Initializer.initLib(String passcode)  
    

除非passcode正确,否则会阻止lib工作。

您可以通过避免以这种方式检查来提高混淆效率:

public void initLib(String passcode) {
    if (passcode == A_GIVEN_PUBLIC_STATIC_THAT_STORESTHE_CODE) {
         // do the proper initializations 
    }
    else {
         throw new RuntimeException("Bad passcode, sorry!");
    }
}

但是这样做:

public void initLib(String passcode) {
    final char[] PASS_ENCRYPTED  = "f5uhjgf56ik8kv214d5".toCharArray();
    final char[] PASS_MINUSMASK  = "bc".toCharArray();
    final int    PASS_SHIFT      = 11;
    final int    PASS_MASK_MINUS = 2;

    for (int ctr = 0; ctr < PASS_MINUSMASK.length; ++ctr) {  
        final char next = PASS_ENCRYPTED[PASS_SHIFT + ctr - PASS_MASK_MINUS];

        if (passcode.charAt(ctr) != next - (PASS_MINUSMASK[ctr] - 'a')) {
            // make the lib unusable by some inits. But it should look as a proper initialization
            return;
        }
    }    

    // make the lib usable by some inits.
}

这看起来很愚蠢,但是如果你看一下混淆代码,你会看到很大的不同。这段代码只是一个例子(它接受“hi”作为有效的密码),任何算法都可以,只要它的混淆版本不太容易反转。

  • 现在的问题是:什么密码?

由于库的保护涉及将使用它的客户端应用程序的开发人员,而不是这些应用程序的最终用户,因此您不能依赖特定于运行应用程序的设备的任何数据。所以没有IMEI或类似的东西。

如果这些开发人员值得信赖,那就没问题了。固定密码就足够了。

但如果他们要将此密码提供给其他人以允许他们使用您的图书馆,那么这就更难了。在这种情况下,我认为如果没有真正的“工业”流程(例如注册客户端应用程序及其代码校验和),您就无法解决问题。这样的过程需要一个特定的设计,不能“仅仅通过代码”解决,但因为它还有成本(时间,资源,客户的参与......),你只能考虑这个,如果库的使用非常危急。

答案 1 :(得分:1)

你不能让你的jar用特定代码和应用程​​序名称调用你的服务器,以检查它们是否已注册?

答案 2 :(得分:0)

当您使用jar构建Android应用程序时,该jar会被编译到应用程序中并成为其中的一部分。你不能只是将jar从包中复制出来并在其他地方使用它。除非我不理解这个问题,否则这不应该是你需要担心的问题。