分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
原创整理不易,转载请注明出处:java spring中对properties属性文件加密及其解密
代码下载地址:http://www.zuidaima.com/share/1781588957400064.htm
加密类:
package com.zuidaima.commons.util;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.security.Key;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.Security;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;/** * <ul> * <li>Title:[DESEncryptUtil]</li> * <li>Description: [加密码解密类]</li> * <li>Copyright 2009 RoadWay Co., Ltd.</li> * <li>All right reserved.</li> * <li>Created by [Huyvanpull] [Jul 19, 2010]</li> * <li>Midified by [修改人] [修改时间]</li> * </ul> * * @version 1.0 */public class DESEncryptUtil{ public static void main(String[] args) throws Exception { /** 生成KEY */ String operatorType = "key"; String keyFilePath = "D:/key.k"; DESEncryptUtil.test(keyFilePath, null, operatorType); /** 加密 */ operatorType = "encrypt"; String sourceFilePath = "D:/jdbc_official.properties"; DESEncryptUtil.test(keyFilePath, sourceFilePath, operatorType); /** 解密 */ operatorType = "decrypt"; sourceFilePath = "D:/en_jdbc_official.properties"; DESEncryptUtil.test(keyFilePath, sourceFilePath, operatorType); } /** * <ul> * <li>Description:[创建一个密钥]</li> * <li>Created by [Huyvanpull] [Jul 19, 2010]</li> * <li>Midified by [修改人] [修改时间]</li> * </ul> * * @return * @throws NoSuchAlgorithmException */ public static Key createKey() throws NoSuchAlgorithmException { Security.insertProviderAt(new com.sun.crypto.provider.SunJCE(), 1); KeyGenerator generator = KeyGenerator.getInstance("DES"); generator.init(new SecureRandom()); Key key = generator.generateKey(); return key; } /** * <ul> * <li>Description:[根据流得到密钥]</li> * <li>Created by [Huyvanpull] [Jul 19, 2010]</li> * <li>Midified by [修改人] [修改时间]</li> * </ul> * * @param is * @return */ public static Key getKey(InputStream is) { try { ObjectInputStream ois = new ObjectInputStream(is); return (Key) ois.readObject(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } /** * <ul> * <li>Description:[对数据进行加密]</li> * <li>Created by [Huyvanpull] [Jul 19, 2010]</li> * <li>Midified by [修改人] [修改时间]</li> * </ul> * * @param key * @param data * @return */ private static byte[] doEncrypt(Key key, byte[] data) { try { Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] raw = cipher.doFinal(data); return raw; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } /** * <ul> * <li>Description:[对数据进行解密]</li> * <li>Created by [Huyvanpull] [Jul 19, 2010]</li> * <li>Midified by [修改人] [修改时间]</li> * </ul> * * @param key * @param in * @return */ public static InputStream doDecrypt(Key key, InputStream in) { try { Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, key); ByteArrayOutputStream bout = new ByteArrayOutputStream(); byte[] tmpbuf = new byte[1024]; int count = 0; while ((count = in.read(tmpbuf)) != -1) { bout.write(tmpbuf, 0, count); tmpbuf = new byte[1024]; } in.close(); byte[] orgData = bout.toByteArray(); byte[] raw = cipher.doFinal(orgData); ByteArrayInputStream bin = new ByteArrayInputStream(raw); return bin; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } private static void test(String keyFilePath, String sourceFilePath, String operatorType) throws Exception { // 提供了Java命令使用该工具的功能 if (operatorType.equalsIgnoreCase("key")) { // 生成密钥文件 Key key = DESEncryptUtil.createKey(); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(keyFilePath)); oos.writeObject(key); oos.close(); System.out.println("成功生成密钥文件" + keyFilePath); } else if (operatorType.equalsIgnoreCase("encrypt")) { // 对文件进行加密 File file = new File(sourceFilePath); FileInputStream in = new FileInputStream(file); ByteArrayOutputStream bout = new ByteArrayOutputStream(); byte[] tmpbuf = new byte[1024]; int count = 0; while ((count = in.read(tmpbuf)) != -1) { bout.write(tmpbuf, 0, count); tmpbuf = new byte[1024]; } in.close(); byte[] orgData = bout.toByteArray(); Key key = getKey(new FileInputStream(keyFilePath)); byte[] raw = DESEncryptUtil.doEncrypt(key, orgData); file = new File(file.getParent() + "\\en_" + file.getName()); FileOutputStream out = new FileOutputStream(file); out.write(raw); out.close(); System.out.println("成功加密,加密文件位于:" + file.getAbsolutePath()); } else if (operatorType.equalsIgnoreCase("decrypt")) { // 对文件进行解密 File file = new File(sourceFilePath); FileInputStream fis = new FileInputStream(file); Key key = getKey(new FileInputStream(keyFilePath)); InputStream raw = DESEncryptUtil.doDecrypt(key, fis); ByteArrayOutputStream bout = new ByteArrayOutputStream(); byte[] tmpbuf = new byte[1024]; int count = 0; while ((count = raw.read(tmpbuf)) != -1) { bout.write(tmpbuf, 0, count); tmpbuf = new byte[1024]; } raw.close(); byte[] orgData = bout.toByteArray(); file = new File(file.getParent() + "\\rs_" + file.getName()); FileOutputStream fos = new FileOutputStream(file); fos.write(orgData); System.out.println("成功解密,解密文件位于:" + file.getAbsolutePath()); } }}
DecryptPropertyPlaceholderConfigurer.java
package com.zuidaima.spring;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.security.Key;import java.util.Properties;import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;import org.springframework.core.io.Resource;import org.springframework.util.DefaultPropertiesPersister;import org.springframework.util.PropertiesPersister;import com.zuidaima.commons.util.DESEncryptUtil;public class DecryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer{ private Resource[] locations; private Resource keyLocation; private String fileEncoding; public void setKeyLocation(Resource keyLocation) { this.keyLocation = keyLocation; } public void setLocations(Resource[] locations) { this.locations = locations; } public void loadProperties(Properties props) throws IOException { if (this.locations != null) { PropertiesPersister propertiesPersister = new DefaultPropertiesPersister(); for (int i = 0; i < this.locations.length; i++) { Resource location = this.locations[i]; if (logger.isInfoEnabled()) { logger.info("Loading properties file from " + location); } InputStream is = null; try { is = location.getInputStream(); Key key = DESEncryptUtil.getKey(keyLocation.getInputStream()); is = DESEncryptUtil.doDecrypt(key, is); if (fileEncoding != null) { propertiesPersister.load(props, new InputStreamReader( is, fileEncoding)); } else { propertiesPersister.load(props, is); } } finally { if (is != null) { is.close(); } } } } }}
配置文件:
- <!-- 加密码属性文件 -->
- <bean id="myPropertyConfigurer"
- class="com.zuidaima.spring.DecryptPropertyPlaceholderConfigurer">
- <property name="locations">
- <list><value>classpath*:spring_config/jdbc_official.databaseinfo</value></list>
- </property>
- <property name="fileEncoding" value="UTF-8"/>
- <property name="keyLocation" value="classpath:spring_config/key.key" />
- </bean>
<!-- 加密码属性文件 --> <bean id="myPropertyConfigurer" class="com.zuidaima.spring.DecryptPropertyPlaceholderConfigurer"> <property name="locations"> <list><value>classpath*:spring_config/jdbc_official.databaseinfo</value></list> </property> <property name="fileEncoding" value="UTF-8"/> <property name="keyLocation" value="classpath:spring_config/key.key" /> </bean>