码迷,mamicode.com
首页 > 编程语言 > 详细

java spring中对properties属性文件加密及其解密

时间:2015-06-03 11:39:06      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

原创整理不易,转载请注明出处:http://blog.csdn.net/yaerfeng/article/details/26561791

加密类:

[java] view plaincopy技术分享技术分享
 
  1.   
  2. import java.io.ByteArrayInputStream;  
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.File;  
  5. import java.io.FileInputStream;  
  6. import java.io.FileOutputStream;  
  7. import java.io.InputStream;  
  8. import java.io.ObjectInputStream;  
  9. import java.io.ObjectOutputStream;  
  10. import java.security.Key;  
  11. import java.security.NoSuchAlgorithmException;  
  12. import java.security.SecureRandom;  
  13. import java.security.Security;  
  14.   
  15. import javax.crypto.Cipher;  
  16. import javax.crypto.KeyGenerator;  
  17.   
  18. /** 
  19.  * <ul> 
  20.  * <li>Title:[DESEncryptUtil]</li> 
  21.  * <li>Description: [加密码解密类]</li> 
  22.  * <li>Copyright 2009 RoadWay Co., Ltd.</li> 
  23.  * <li>All right reserved.</li> 
  24.  * <li>Created by [Huyvanpull] [Jul 19, 2010]</li> 
  25.  * <li>Midified by [修改人] [修改时间]</li> 
  26.  * </ul> 
  27.  *  
  28.  * @version 1.0 
  29.  */  
  30. public class DESEncryptUtil  
  31. {  
  32.     public static void main(String[] args) throws Exception  
  33.     {  
  34.         /** 生成KEY */  
  35.         String operatorType = "key";  
  36.         String keyFilePath = "D:/key.k";  
  37.         DESEncryptUtil.test(keyFilePath, null, operatorType);  
  38.           
  39.         /** 加密 */  
  40.         operatorType = "encrypt";  
  41.         String sourceFilePath = "D:/jdbc_official.properties";  
  42.         DESEncryptUtil.test(keyFilePath, sourceFilePath, operatorType);  
  43.           
  44.         /** 解密 */  
  45.         operatorType = "decrypt";  
  46.         sourceFilePath = "D:/en_jdbc_official.properties";  
  47.         DESEncryptUtil.test(keyFilePath, sourceFilePath, operatorType);  
  48.     }  
  49.     /** 
  50.      * <ul> 
  51.      * <li>Description:[创建一个密钥]</li> 
  52.      * <li>Created by [Huyvanpull] [Jul 19, 2010]</li> 
  53.      * <li>Midified by [修改人] [修改时间]</li> 
  54.      * </ul> 
  55.      *  
  56.      * @return 
  57.      * @throws NoSuchAlgorithmException 
  58.      */  
  59.     public static Key createKey() throws NoSuchAlgorithmException  
  60.     {  
  61.         Security.insertProviderAt(new com.sun.crypto.provider.SunJCE(), 1);  
  62.         KeyGenerator generator = KeyGenerator.getInstance("DES");  
  63.         generator.init(new SecureRandom());  
  64.         Key key = generator.generateKey();  
  65.         return key;  
  66.     }  
  67.       
  68.     /** 
  69.      * <ul> 
  70.      * <li>Description:[根据流得到密钥]</li> 
  71.      * <li>Created by [Huyvanpull] [Jul 19, 2010]</li> 
  72.      * <li>Midified by [修改人] [修改时间]</li> 
  73.      * </ul> 
  74.      *  
  75.      * @param is 
  76.      * @return 
  77.      */  
  78.     public static Key getKey(InputStream is)  
  79.     {  
  80.         try  
  81.         {  
  82.             ObjectInputStream ois = new ObjectInputStream(is);  
  83.             return (Key) ois.readObject();  
  84.         }  
  85.         catch (Exception e)  
  86.         {  
  87.             e.printStackTrace();  
  88.             throw new RuntimeException(e);  
  89.         }  
  90.     }  
  91.       
  92.     /** 
  93.      * <ul> 
  94.      * <li>Description:[对数据进行加密]</li> 
  95.      * <li>Created by [Huyvanpull] [Jul 19, 2010]</li> 
  96.      * <li>Midified by [修改人] [修改时间]</li> 
  97.      * </ul> 
  98.      *  
  99.      * @param key 
  100.      * @param data 
  101.      * @return 
  102.      */  
  103.     private static byte[] doEncrypt(Key key, byte[] data)  
  104.     {  
  105.         try  
  106.         {  
  107.             Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");  
  108.             cipher.init(Cipher.ENCRYPT_MODE, key);  
  109.             byte[] raw = cipher.doFinal(data);  
  110.             return raw;  
  111.         }  
  112.         catch (Exception e)  
  113.         {  
  114.             e.printStackTrace();  
  115.             throw new RuntimeException(e);  
  116.         }  
  117.     }  
  118.       
  119.     /** 
  120.      * <ul> 
  121.      * <li>Description:[对数据进行解密]</li> 
  122.      * <li>Created by [Huyvanpull] [Jul 19, 2010]</li> 
  123.      * <li>Midified by [修改人] [修改时间]</li> 
  124.      * </ul> 
  125.      *  
  126.      * @param key 
  127.      * @param in 
  128.      * @return 
  129.      */  
  130.     public static InputStream doDecrypt(Key key, InputStream in)  
  131.     {  
  132.         try  
  133.         {  
  134.             Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");  
  135.             cipher.init(Cipher.DECRYPT_MODE, key);  
  136.             ByteArrayOutputStream bout = new ByteArrayOutputStream();  
  137.             byte[] tmpbuf = new byte[1024];  
  138.             int count = 0;  
  139.             while ((count = in.read(tmpbuf)) != -1)  
  140.             {  
  141.                 bout.write(tmpbuf, 0, count);  
  142.                 tmpbuf = new byte[1024];  
  143.             }  
  144.             in.close();  
  145.             byte[] orgData = bout.toByteArray();  
  146.             byte[] raw = cipher.doFinal(orgData);  
  147.             ByteArrayInputStream bin = new ByteArrayInputStream(raw);  
  148.             return bin;  
  149.         }  
  150.         catch (Exception e)  
  151.         {  
  152.             e.printStackTrace();  
  153.             throw new RuntimeException(e);  
  154.         }  
  155.     }  
  156.       
  157.     private static void test(String keyFilePath, String sourceFilePath,  
  158.             String operatorType) throws Exception  
  159.     {  
  160.         // 提供了Java命令使用该工具的功能  
  161.         if (operatorType.equalsIgnoreCase("key"))  
  162.         {  
  163.             // 生成密钥文件  
  164.             Key key = DESEncryptUtil.createKey();  
  165.             ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(keyFilePath));  
  166.             oos.writeObject(key);  
  167.             oos.close();  
  168.             System.out.println("成功生成密钥文件" + keyFilePath);  
  169.         }  
  170.         else if (operatorType.equalsIgnoreCase("encrypt"))  
  171.         {  
  172.             // 对文件进行加密  
  173.             File file = new File(sourceFilePath);  
  174.             FileInputStream in = new FileInputStream(file);  
  175.             ByteArrayOutputStream bout = new ByteArrayOutputStream();  
  176.             byte[] tmpbuf = new byte[1024];  
  177.             int count = 0;  
  178.             while ((count = in.read(tmpbuf)) != -1)  
  179.             {  
  180.                 bout.write(tmpbuf, 0, count);  
  181.                 tmpbuf = new byte[1024];  
  182.             }  
  183.             in.close();  
  184.             byte[] orgData = bout.toByteArray();  
  185.             Key key = getKey(new FileInputStream(keyFilePath));  
  186.             byte[] raw = DESEncryptUtil.doEncrypt(key, orgData);  
  187.             file = new File(file.getParent() + "\\en_" + file.getName());  
  188.             FileOutputStream out = new FileOutputStream(file);  
  189.             out.write(raw);  
  190.             out.close();  
  191.             System.out.println("成功加密,加密文件位于:" + file.getAbsolutePath());  
  192.         }  
  193.         else if (operatorType.equalsIgnoreCase("decrypt"))  
  194.         {  
  195.             // 对文件进行解密  
  196.             File file = new File(sourceFilePath);  
  197.             FileInputStream fis = new FileInputStream(file);  
  198.               
  199.             Key key = getKey(new FileInputStream(keyFilePath));  
  200.             InputStream raw = DESEncryptUtil.doDecrypt(key, fis);  
  201.             ByteArrayOutputStream bout = new ByteArrayOutputStream();  
  202.             byte[] tmpbuf = new byte[1024];  
  203.             int count = 0;  
  204.             while ((count = raw.read(tmpbuf)) != -1)  
  205.             {  
  206.                 bout.write(tmpbuf, 0, count);  
  207.                 tmpbuf = new byte[1024];  
  208.             }  
  209.             raw.close();  
  210.             byte[] orgData = bout.toByteArray();  
  211.             file = new File(file.getParent() + "\\rs_" + file.getName());  
  212.             FileOutputStream fos = new FileOutputStream(file);  
  213.             fos.write(orgData);  
  214.             System.out.println("成功解密,解密文件位于:" + file.getAbsolutePath());  
  215.         }  
  216.     }  
  217. }  


DecryptPropertyPlaceholderConfigurer.java

[java] view plaincopy技术分享技术分享
 
  1. package com.zuidaima.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.       
  35.     public void loadProperties(Properties props) throws IOException  
  36.     {  
  37.         if (this.locations != null)  
  38.         {  
  39.             PropertiesPersister propertiesPersister = new DefaultPropertiesPersister();  
  40.             for (int i = 0; i < this.locations.length; i++)  
  41.             {  
  42.                 Resource location = this.locations[i];  
  43.                 if (logger.isInfoEnabled())  
  44.                 {  
  45.                     logger.info("Loading properties file from " + location);  
  46.                 }  
  47.                 InputStream is = null;  
  48.                 try  
  49.                 {  
  50.                     is = location.getInputStream();  
  51.                     Key key = DESEncryptUtil.getKey(keyLocation.getInputStream());  
  52.                     is = DESEncryptUtil.doDecrypt(key, is);  
  53.                     if (fileEncoding != null)  
  54.                     {  
  55.                         propertiesPersister.load(props, new InputStreamReader(  
  56.                                 is, fileEncoding));  
  57.                     }  
  58.                     else  
  59.                     {  
  60.                         propertiesPersister.load(props, is);  
  61.                     }  
  62.                 }  
  63.                 finally  
  64.                 {  
  65.                     if (is != null)  
  66.                     {  
  67.                         is.close();  
  68.                     }  
  69.                 }  
  70.             }  
  71.         }  
  72.     }  
  73. }  


配置文件:

[xml] view plaincopy技术分享技术分享
 
    1. <!-- 加密码属性文件 -->  
    2.     <bean id="myPropertyConfigurer"  
    3.         class="com.zuidaima.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>  

java spring中对properties属性文件加密及其解密

标签:

原文地址:http://www.cnblogs.com/leiloky/p/4548437.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!