properties配置文件的加密
生活随笔
收集整理的這篇文章主要介紹了
properties配置文件的加密
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
要完成properties屬性文件某些屬性值的加密,和讀取屬性文件時進行解密,需要4個步驟
接下來我們將拿配置數據庫的properties文件進行舉例(一般我們需要對用戶名和密碼進行加密)
編寫加密解密工具類
在編寫工具類前我們需要導入包含Base64這個類的依賴
<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version> </dependency>之所以要使用Base64對加密后的byte數組進行編碼,可以參考Base64編碼及其作用
編寫使用DES加密算法的加密解密工具類
package com.lxc.o2o.util; import java.io.UnsupportedEncodingException; import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import org.apache.commons.codec.binary.Base64;/*** DES是一種對稱加密算法,所謂對稱加密算法即:加密和解密使用相同密鑰的算法。* */ public class DESUtil {// 秘鑰對象private static Key key;// 設置密鑰keyprivate static String KEY_STR = "myKey";// 使用的編碼private static String CHARSETNAME = "UTF-8";// 設置使用DES算法(我們這里主要使用java的DES算法)private static String ALGORITHM = "DES";// 初始化秘鑰對象keystatic {try {// 生成DES算法對象KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);// 運用SHA1安全策略SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");// 設置上密鑰種子secureRandom.setSeed(KEY_STR.getBytes());// 初始化基于SHA1的算法對象generator.init(secureRandom);// 生成密鑰對象key = generator.generateKey();generator = null;} catch (Exception e) {throw new RuntimeException(e);}}/*** 獲取加密后的信息* * @param str* @return*/public static String getEncryptString(String str) {try {// 按UTF8編碼byte[] bytes = str.getBytes(CHARSETNAME);// 獲取加密對象Cipher cipher = Cipher.getInstance(ALGORITHM);// 初始化密碼信息,Cipher.ENCRYPT_MODE為加密類型cipher.init(Cipher.ENCRYPT_MODE, key);// 加密byte[] doFinal = cipher.doFinal(bytes);// 基于BASE64編碼,接收byte[]并轉換成String// byte[]to encode好的String并返回,編碼成字符串返回return Base64.encodeBase64String(doFinal);} catch (Exception e) {// TODO: handle exceptionthrow new RuntimeException(e);}}/*** 獲取解密之后的信息* * @param str* @return*/public static String getDecryptString(String str) {try {// 基于BASE64編碼,接收byte[]并轉換成String// 將字符串decode成byte[],解碼操作byte[] bytes = Base64.decodeBase64(str);// 獲取解密對象Cipher cipher = Cipher.getInstance(ALGORITHM);// 初始化解密信息cipher.init(Cipher.DECRYPT_MODE, key);// 解密byte[] doFinal = cipher.doFinal(bytes);// 返回解密之后的信息return new String(doFinal, CHARSETNAME);} catch (Exception e) {// TODO: handle exceptionthrow new RuntimeException(e);}}public static void main(String[] args) throws UnsupportedEncodingException {System.out.println(getEncryptString("root"));System.out.println(getEncryptString("123456"));}}獲取用戶名和密碼的秘文
通過上面編寫的DESUtil獲取用戶名和密碼的密文,再把密文填寫進jdbc.properties文件
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/myo2o?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8 jdbc.username=WnplV/ietfQ= jdbc.password=QAHlVoUc49w=編寫PropertyPlaceholderConfigurer的子類
package com.lxc.o2o.util; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; /*** 獲取解密后的屬性值*/ public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {// 需要加密的字段數組(這里整個jdbc屬性文件,我們只對username和password加密了)private String[] encryptPropNames = { "jdbc.username", "jdbc.password" };/*** 對關鍵的屬性進行轉換,重寫PropertyPlaceholderConfigurer中的convertProperty方法* 這個函數會對屬性文件中所有的屬性鍵值對進行讀取*/@Overrideprotected String convertProperty(String propertyName, String propertyValue) {// 判斷屬性值是否被加密了if (isEncryptProp(propertyName)) {// 對已加密的字段進行解密工作String decryptValue = DESUtil.getDecryptString(propertyValue);return decryptValue;} else {// 如果沒被加密,直接返回return propertyValue;}}/*** 判斷該屬性是否已加密,主要拿傳進來的屬性名和上面我們定義的需要加密的字段數組進行比對* * @param propertyName* @return*/private boolean isEncryptProp(String propertyName) {// 若等于需要加密的field,則進行加密for (String encryptpropertyName : encryptPropNames) {if (encryptpropertyName.equals(propertyName))return true;}return false;} }配置Bean
在spring-dao.xml配置文件中配置我們自己實現的EncryptPropertyPlaceholderConfigurer類
<!--連接數據庫時,會自動讀取對應的配置文件,并進行解密操作--> <bean class="com.lxc.o2o.util.EncryptPropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:jdbc.properties</value><!-- 如果要讀取其他加密的配置文件,繼續配置在這個list中 --></list></property><property name="fileEncoding" value="UTF-8"></property> </bean>運行時創建了上面的bean后,可以直接通過${屬性名}獲取解密后的屬性值
<!-- 2.數據庫連接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><!--配置連接池屬性 --><property name="driverClass" value="${jdbc.driver}"></property><property name="jdbcUrl" value="${jdbc.url}"></property><property name="user" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property> </bean> 12345678到這里我們就完成了加密和解密properties文件的所有操作
總結
以上是生活随笔為你收集整理的properties配置文件的加密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3精要(24)-函数内省、函
- 下一篇: access开发精要(3)-子数据表