[英]Java JAR protection
我已經編寫了Java應用程序的代碼,並打算在線分發它。 每個發行版都將使用我制作的秘密串行密鑰進行鎖定。
我需要從反編譯器等保護我的jar文件。這是到目前為止我所做的:
我已經完成了步驟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.