问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么能让spring框架加载加密后的.class文件

发布网友 发布时间:2022-04-21 04:23

我来回答

1个回答

热心网友 时间:2022-06-17 23:21

加密:使用AES加密,将文件的字节码读取,对字节码进行加密后替换源文件

Java代码

/**

*

* 字节加密

*/

public static byte[] encrypt(byte[] data, String key) throws Exception {

Key k = toKey(Base64.decode(key));

byte[] raw = k.getEncoded();

SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);

Cipher cipher = Cipher.getInstance(ALGORITHM);

cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

return cipher.doFinal(data);

}
/**
*
* 字节加密
*/
public static byte[] encrypt(byte[] data, String key) throws Exception {
Key k = toKey(Base64.decode(key));
byte[] raw = k.getEncoded();
SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
return cipher.doFinal(data);
}

解密:

1、在tomcat的WebappClassLoader中修改源码(自动义类加载器);

2、修改spring源码Code包源码。

加密方法

Java代码

public static byte[] decrypt(byte[] data, String key) throws Exception {

Key k = toKey(Base64.decode(key));

byte[] raw = k.getEncoded();

SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);

Cipher cipher = Cipher.getInstance(ALGORITHM);

cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);

return cipher.doFinal(data);

}
public static byte[] decrypt(byte[] data, String key) throws Exception {
Key k = toKey(Base64.decode(key));
byte[] raw = k.getEncoded();
SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
return cipher.doFinal(data);
}

在 WebappClassLoader中解密

Java代码

/**

* 判断如需是需要解密的类进行数据处理

* */

//--------------------------------------start----------------------------------//

byte []data=null;

try {

if(isDecode(name)){

System.out.println("2818:--&&&-"+name);

data=AESUtils.decrypt(entry.binaryContent, key);

}else{

data=entry.binaryContent;

}

} catch (Exception e) {

e.printStackTrace();

}

try {

clazz = defineClass(name, data, 0,

data.length,

new CodeSource(entry.codeBase, entry.certificates));

//--------------------------------------end----------------------------------//
/**
* 判断如需是需要解密的类进行数据处理
* */
//--------------------------------------start----------------------------------//
byte []data=null;
try {
if(isDecode(name)){
System.out.println("2818:--&&&-"+name);
data=AESUtils.decrypt(entry.binaryContent, key);
}else{
data=entry.binaryContent;
}
} catch (Exception e) {
e.printStackTrace();
}
try {
clazz = defineClass(name, data, 0,
data.length,
new CodeSource(entry.codeBase, entry.certificates));
//--------------------------------------end----------------------------------//

在spring的code包的SimpleMetadataReader修改器构造函数

Java代码

// TODO 修改源码判断是否需要解密

SimpleMetadataReader(Resource resource, ClassLoader classLoader)

throws IOException {

InputStream is = resource.getInputStream();

ClassReader classReader = null;

try {

String name = "";

if (resource.getURI().toString().indexOf("jar:file") == -1) {

name = resource.getFile().getAbsolutePath();

if (!"".equals(name) && isDecode(name, cams)) {

byte[] data = inputStreamToByte(is);

try {

is = new ByteArrayInputStream(AESUtils.decrypt(data,

key));

// is = new ByteArrayInputStream(data);

} catch (Exception e) {

e.printStackTrace();

}

}

}

classReader = new ClassReader(is);

} finally {

is.close();

}
// TODO 修改源码判断是否需要解密
SimpleMetadataReader(Resource resource, ClassLoader classLoader)
throws IOException {
InputStream is = resource.getInputStream();
ClassReader classReader = null;
try {
String name = "";
if (resource.getURI().toString().indexOf("jar:file") == -1) {
name = resource.getFile().getAbsolutePath();
if (!"".equals(name) && isDecode(name, cams)) {
byte[] data = inputStreamToByte(is);
try {
is = new ByteArrayInputStream(AESUtils.decrypt(data,
key));
// is = new ByteArrayInputStream(data);
} catch (Exception e) {
e.printStackTrace();
}
}
}
classReader = new ClassReader(is);
} finally {
is.close();
}

在LocalVariableTableParameterNameDiscoverer同样需要进行解密。

注:(此加密有弊端)

1、加密解密算法需保持一致。

2、加密加密密钥需是同一密钥。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ipo过会什么意思 ipo已过会是什么状态 写一篇演讲稿关于中学生应该如何管理时间的作文用英语写的主人公是... 最新非法行医罪既遂量刑标准是怎么样的 行医罪既遂能判多少年 ...别人随便说的一句话都想很多 往坏处想 好累……怎 ...好累 心态不好 总是想法偏激 把人和事往坏处想 想的复杂 很累 不乐... ...什么都往坏处想 很敏感 想很多 我不想这样 想改变下心态 我这样 因 ... 苏新皓为什么叫玺哥 苏新皓什么时候进的时代峰峻 如何隐藏自己制作的jar下的核心代码 关于继承与classloader的类啥时执行 如何在eclipse上创建一个web项目 如何有效的防止Java程序被反编译和破解 apk如何防止被破解 【转】如何保护Java代码 自定义classloader 加密 怎么破解class 我手头有一个web系统,很多java class类都是加密的,是用classloader.dll加载 如何覆写URLClassLoader 动态解密des加密过的jar包 excel只清除数字不清除公式 excel表格怎么只清除表格里的数字而不清除公式啊? excel怎么做能只删除单元格显示数值,而不删除公式 Excel中,可以只删除数值而不删除公式吗? 怎样在excel表格中只删除数字不删除公式 怎么把EXCEL表格里的内容删除而不改变其中的公式呢? excel如何删除数据而不删除公式求解 EXCEL表格怎么清除数字不清除公式 excel怎样只删除格内内容而不删除公式 怎样做才不会删除EXCEL表中公式,只删除数据? ros中classloader动态加载的对象是什么时候编译的 java.util.zip.ZipException这个问题怎么解决? 为什么要自定义classloader 如何防止程序员反编译? javaclass类加密后 如何部署到tomcat 如何获取jar文件中的函数 如何利用DES加密的算法保护Java源代码 红米note7pro怎样预约flyme8尝鲜版 魅族系统flyme多长时间更新一次? 魅族flyme系统4.2.3几时推送 苹果手机怎么设置个别电话打不进来 360浏览器怎么打印预览 汤姆索亚历险记的读书笔记该怎么写呀?要求摘抄及感悟 汤姆索亚历险记读书笔记怎么写? 汤姆索亚历险记的读书笔记 汤姆索亚历险记 读书笔记 汤姆索亚历险记,读书笔记怎么写? 《汤姆索亚历险记》读书摘抄笔记 《汤姆索亚历险记》,读书笔记五篇。 《汤姆索雅历险记》读书笔记