Srping实现XML配置文件的加密解密

byte数组是不能强制转换成字符串的,换言之:字符串(2个字节)和byte数组在这种情况下不是互逆的;要避免这种情况,我们需要做一些修订,可以考虑将二进制数据转换成十六进制表示,不然会报 javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher

  1. package front.spring;  
  2.  public class DES {

     private Key key;        //密钥
     /**
         * 根据参数生成KEY
         *
         * @param strKey 密钥字符串
         */
        public void getKey(String strKey) {
            try {
                KeyGenerator _generator = KeyGenerator.getInstance("DES");
                _generator.init(new SecureRandom(strKey.getBytes()));
                this.key = _generator.generateKey();
                _generator = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        /**
         * 加密String明文输入,String密文输出
         *
         * @param strMing String明文
         * @return String密文
         */
        public String getEncString(String strMing) {
            byte[] byteMi = null;
            byte[] byteMing = null;
            String strMi = "";
            try {
                /*byteMing = strMing.getBytes("UTF8");
                byteMi = this.getEncCode(byteMing);
                strMi = new String(byteMi, "UTF8");*/
             strMi = parseByte2HexStr(getEncCode(strMing.getBytes()));
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                byteMing = null;
                byteMi = null;
            }
            return strMi;
        }
        /**
         * 解密 以String密文输入,String明文输出
         *
         * @param strMi String密文
         * @return String明文
         */
        public String getDesString(String strMi) {
         byte[] byteMi = null;
            byte[] byteMing = null;
            String strMing = "";
            try {
             /*byteMi = strMi.getBytes("UTF8");
                byteMing = this.getDesCode(byteMi);
                strMing = new String(byteMing, "UTF8");*/
             strMing = new String(getDesCode(parseHexStr2Byte(strMi)));
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                byteMing = null;
                byteMi = null;
            }
            return strMing;
        }
        /**
         * 加密以byte[]明文输入,byte[]密文输出
         *
         * @param byteS byte[]明文
         * @return byte[]密文
         */
        private  byte[] getEncCode(byte[] byteS) {
            byte[] byteFina = null;
            Cipher cipher;
            try {
                cipher = Cipher.getInstance("DES");
                cipher.init(Cipher.ENCRYPT_MODE, key);
                byteFina = cipher.doFinal(byteS);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                cipher = null;
            }
            return byteFina;
        }
        /**
         * 解密以byte[]密文输入,以byte[]明文输出
         *
         * @param byteD byte[]密文
         * @return byte[]明文
         */
        private  byte[] getDesCode(byte[] byteD) {
            Cipher cipher;
            byte[] byteFina = null;
            try {
                cipher = Cipher.getInstance("DES");
                cipher.init(Cipher.DECRYPT_MODE, key);
                byteFina = cipher.doFinal(byteD);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                cipher = null;
            }
            return byteFina;
        }
        
        /**
         * 将二进制转换成16进制 
         * @param buf
         * @return
         */
         public  String parseByte2HexStr(byte buf[]) {  
          StringBuffer sb = new StringBuffer();  
       for (int i = 0; i < buf.length; i++) {
        String hex = Integer.toHexString(buf[i] & 0xFF);
        if (hex.length() == 1) {
         hex = '0' + hex;
        }
        sb.append(hex.toUpperCase());
       }
       return sb.toString();
         }
          
         /**
          * 将16进制转换为二进制 
          * @param hexStr
          * @return
          */
      public byte[] parseHexStr2Byte(String hexStr) {
     
       if (hexStr.length() < 1)
     
        return null;
       byte[] result = new byte[hexStr.length() / 2];
       for (int i = 0; i < hexStr.length() / 2; i++) {
        int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
        int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),
          16);
        result[i] = (byte) (high * 16 + low);
       }
       return result;
      }

     

    }



对PropertyPlaceholderConfigurer进行改装:

  1. package front.spring;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.InputStreamReader;  
  6. import java.security.Key;  
  7. import java.util.Properties;  
  8.   
  9. import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;  
  10. import org.springframework.core.io.Resource;  
  11. import org.springframework.util.DefaultPropertiesPersister;  
  12. import org.springframework.util.PropertiesPersister;  
  13.   
  14. import com.zuidaima.commons.util.DESEncryptUtil;  
  15.   
  16. public class DecryptPropertyPlaceholderConfigurer extends  
  17.         PropertyPlaceholderConfigurer  
  18. {  
  19.     private Resource[] locations;  
  20.       
  21.     private Resource keyLocation;  
  22.       
  23.     private String fileEncoding;  
  24.       
  25.     public void setKeyLocation(Resource keyLocation)  
  26.     {  
  27.         this.keyLocation = keyLocation;  
  28.     }  
  29.       
  30.     public void setLocations(Resource[] locations)  
  31.     {  
  32.         this.locations = locations;  
  33.     }  
  34.      //这边重写processProperties()方法,对配置进行转码
  35.       @override
  36.       protected void processProperties().....
  37.     }  
  38. }  

最终要做的就是配置bean(id="propertyConfigurer"这个是固定的,只需要修改class为自己实现的类就行,参数可以自己增设) :
  1. <!-- 加密码属性文件 -->  
  2.     <bean id="propertyConfigurer"  
  3.         class="front.spring.DecryptPropertyPlaceholderConfigurer">  
  4.         <property name="locations">  
  5.             <list><value>classpath*:spring_config/jdbc_official.databaseinfo</value></list>  
  6.         </property>  
  7.         <property name="fileEncoding" value="UTF-8"/>  
  8.         <property name="keyLocation" value="classpath:spring_config/key.key" />  
  9.     </bean>  


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xml加密(XML Encryption)是w3c加密xml的标准。这个加密过程包括加密xml文档的元素及其子元素,通过加密,xml的初始内容将被替换,但其xml格式仍然被完好的保留。 介绍 我们有3个加密xml的方法 1、仅仅使用对称加密的方法加密xml 这种加密方法只使用一个密钥,也就是说无论是加密xml还是解密xml都使用一个相同的密钥。因为这个密钥不会在被加密的xml保存,所以我们需要在加密和解密的过程加载这个密钥并保护它不被窃取。 2、使用对称加密和非对称加密相结合的方法来加密xml 这种方法需要一个用于加密数据的对称密钥和一个用于保护这个对称密钥的非对称密钥。被加密的对称密钥和被加密的数据一起保存在xml文档。当用私有非对称密钥解密密钥的时候要用公开非对称密钥对密钥进行加密。 本文就将使用这种方法。想学到其他更多的方法请参看MSDN等到更多的信息。 (译者注:非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。) 3、使用X.509加密xml,这种方法是用X.509作为非对称密钥,它由诸如VeriSign之类的第三方提供。 方法 不管xml加密是如何完成的,保存加密数据总是用两种方法之一。 1、加密后所有的元素都被命名为 2、加密后只有数据被替换,而元素名称仍然是可读的,不会发生变化。
1、DES(Data Encryption Standard):对称算法,数据加密标准,速度较快,适用于加密大量数据的场合; 2、3DES(Triple DES):是基于DES的对称算法,对一块数据用三个不同的密钥进行三次加密,强度更高; 3、RC2和RC4:对称算法,用变长密钥对大量数据进行加密,比 DES 快; 4、IDEA(International Data Encryption Algorithm)国际数据加密算法,使用 128 位密钥提供非常强的安全性; 5、RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的,非对称算法; 6、DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准),严格来说不算加密算法; 7、AES(Advanced Encryption Standard):高级加密标准,对称算法,是下一代的加密算法标准,速度快,安全级别高,在21世纪AES 标准的一个实现是 Rijndael 算法; 8、BLOWFISH,它使用变长的密钥,长度可达448位,运行速度很快; 9、MD5:严格来说不算加密算法,只能说是摘要算法; 10、PKCS:The Public-Key Cryptography Standards (PKCS)是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。 11、SSF33,SSF28,SCB2(SM1):国家密码局的隐蔽不公开的商用算法,在国内民用和商用的,除这些都不容许使用外,其他的都可以使用; 12、ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。 13、TEA(Tiny Encryption Algorithm)简单高效的加密算法,加密解密速度快,实现简单等等等等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值