web项目加解密

环境:tomcat6.X+struts2.X+MyIbatis+Spring3.x

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

/**
	 * 
	 * 字节加密
	 */
	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包源码。

加密方法

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中解密

/**
			 * 判断如需是需要解密的类进行数据处理
			 * */
            //--------------------------------------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修改器构造函数

// 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、加密加密密钥需是同一密钥。     

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java Web项目中,加解密是一项常见的安全需求。可以使用各种加密算法和技术来实现数据的加密和解密操作。下面是一种常见的加解密方式: 1. 对称加密:对称加密使用相同的密钥进行加密和解密操作。常见的对称加密算法有DES、AES等。在Java中,可以使用javax.crypto包提供的相关类和方法来实现对称加密。 加密过程: - 生成一个密钥,可以使用KeyGenerator类来生成。 - 创建一个Cipher对象,指定加密算法和工作模式。 - 初始化Cipher对象,指定加密模式和密钥。 - 调用Cipher的doFinal方法进行加密操作。 解密过程: - 创建一个Cipher对象,指定解密算法和工作模式。 - 初始化Cipher对象,指定解密模式和密钥。 - 调用Cipher的doFinal方法进行解密操作。 2. 非对称加密:非对称加密使用一对密钥,分别为公钥和私钥。公钥用于加密数据,私钥用于解密数据。常见的非对称加密算法有RSA、DSA等。在Java中,可以使用java.security包提供的相关类和方法来实现非对称加密。 加密过程: - 生成一对公私钥,可以使用KeyPairGenerator类来生成。 - 创建一个Cipher对象,指定加密算法。 - 初始化Cipher对象,指定加密模式和公钥。 - 调用Cipher的doFinal方法进行加密操作。 解密过程: - 创建一个Cipher对象,指定解密算法。 - 初始化Cipher对象,指定解密模式和私钥。 - 调用Cipher的doFinal方法进行解密操作。 除了对称加密和非对称加密,还可以使用哈希算法来实现数据的摘要和验证。常见的哈希算法有MD5、SHA-1、SHA-256等。在Java中,可以使用java.security包提供的相关类和方法来实现哈希算法。 以上是一种常见的加解密方式,具体的实现方式可以根据项目需求和安全要求进行选择和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值