簡體   English   中英

Java JAR保護

[英]Java JAR protection

我已經編寫了Java應用程序的代碼,並打算在線分發它。 每個發行版都將使用我制作的秘密串行密鑰進行鎖定。

我需要從反編譯器等保護我的jar文件。這是到目前為止我所做的:

  1. 用戶將其序列號輸入表單
  2. 該序列通過php腳本發送到我的開發服務器
  3. 該腳本生成一個新的jar bin文件,該文件在AES 128中加密
  4. 我的“加載程序”將jar文件下載為字節並解密。
  5. 它調用main方法。
  6. 用戶可以隨意使用該應用
  7. 用戶關閉應用程序
  8. 清除緩存,一切返回到步驟1或之前。

我已經完成了步驟1到3,但是我需要知道是否有可能創建一個自定義類加載器,該類加載器從HTTP抓取字節,解密並調用main方法。 由於文件已完全加密(在PHP服務器上另存為bin),所以我不能使用基本的類加載器。 關於步驟8,是否可以從計算機的內存中卸載內容?

是的,有可能,但也沒有用。

您的類加載器將是安全系統的最薄弱點。 它無法加密,因此反編譯起來相對容易。

現在,由於在類加載器中必須有一個必須以字節數組形式存儲的解密類,因此攻擊者唯一要做的就是將該字節數組轉儲到文件中。

參考dystroy的代碼:

classBytes = EncryptionUtil.decryptBytes(url, key); 

// In this moment, classBytes contains unencrypted class.
// If an attacker adds:   
//
//   FileOutputStream fos = new FileOutputStream("some.name");
//   fos.write(classBytes);
//   fos.close();
// 
// he will destroy all your security.


return defineClass(name, classBytes, 0, classBytes.length);

是的,您可以將獲取的字節提供給類加載器。 我在類似的問題中這樣做:

public class SecureClassLoader extends URLClassLoader {

    @Override
    protected Class<?> findClass(final String name) throws ClassNotFoundException {
        if (isEncrypted(name)) {
            final String resourceName = name.replace('.', '/') + ".class";
            URL url = findResource(resourceName);
            if (url != null) {
                byte[] classBytes = null;
                try {
                    classBytes = EncryptionUtil.decryptBytes(url, key);
                    return defineClass(name, classBytes, 0, classBytes.length);
                } catch (ClassFormatError e) {
                    log.severe("Bad format for decrypted class " + name);
                    throw new EncryptedClassNotFoundException(name, e);
                } catch (InvalidKeyException e) {
                    throw new EncryptedClassNotFoundException(name, e);
                } catch (IOException e) {
                    throw new EncryptedClassNotFoundException(name, e);
                }
            }
        }

        // default loader
        try {
            return super.findClass(name);
        } catch (ClassNotFoundException e) {
            throw new EncryptedClassNotFoundException(name, e);
        }
    }

    private boolean isEncrypted(String className) {
        /// some things
    }
}

但這還不足以保護您的代碼。 至少,不要為兩個用戶使用相同的字節(您似乎這樣做了)。 並混淆您的代碼(我使用proguard)。 這樣可以保護您免受普通黑客的攻擊,而不是最優秀的黑客。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM