實現 重寫加解密方法
然後在配置文件上把需要加解密的屬性上加
第一步:maven引相關包
<!--實現自動 加密解密-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>1.16</version>
</dependency>
<!--httpClient http遠程調用解密加密-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.9</version>
</dependency>
第二步:本地的凱撒加密類 和 http請求類
/**
* 凱撒加密解密工具類
* @author lvxk 2019-07-10 14:02
*/
public class KaiserUtil {
/**
* 使用凱撒加密方式加密數據
*
* @param orignal :原文
* @param key :密鑰
* @return :加密後的數據
*/
public static String encryptKaiser(String orignal, int key) {
// 將字符串轉爲字符數組
char[] chars = orignal.toCharArray();
StringBuilder sb = new StringBuilder();
// 遍歷數組
for (char aChar : chars) {
// 獲取字符的ASCII編碼
int asciiCode = aChar;
// 偏移數據
asciiCode += key;
// 將偏移後的數據轉爲字符
char result = (char) asciiCode;
// 拼接數據
sb.append(result);
}
return sb.toString();
}
/**
* 使用凱撒加密方式解密數據
*
* @param encryptedData :密文
* @param key :密鑰
* @return : 源數據
*/
public static String decryptKaiser(String encryptedData, int key) {
// 將字符串轉爲字符數組
char[] chars = encryptedData.toCharArray();
StringBuilder sb = new StringBuilder();
// 遍歷數組
for (char aChar : chars) {
// 獲取字符的ASCII編碼
int asciiCode = aChar;
// 偏移數據
asciiCode -= key;
// 將偏移後的數據轉爲字符
char result = (char) asciiCode;
// 拼接數據
sb.append(result);
}
return sb.toString();
}
}
import org.apache.commons.codec.Charsets;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
/**
* @author luokangtao
* @create 2019-10-22 16:03
*/
public class HttpUtil {
public static String sendHttpPost(String url, String body) throws Exception {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", "application/json;charset=UTF-8");
httpPost.setHeader("Accept", "application/json");
httpPost.setEntity(new StringEntity(body, Charsets.UTF_8));
CloseableHttpResponse response = httpClient.execute(httpPost);
System.out.println(response.getStatusLine().getStatusCode() + "\n");
HttpEntity entity = response.getEntity();
String responseContent = EntityUtils.toString(entity, "UTF-8");
response.close();
httpClient.close();
return responseContent;
}
public static String sendHttpGet(String url) throws Exception {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
httpGet.addHeader("Content-Type", "application/json;charset=UTF-8");
httpGet.setHeader("Accept", "application/json");
CloseableHttpResponse response = httpClient.execute(httpGet);
System.out.println(response.getStatusLine().getStatusCode() + "\n");
HttpEntity entity = response.getEntity();
String responseContent = EntityUtils.toString(entity, "UTF-8");
response.close();
httpClient.close();
return responseContent;
}
}
第三步:重寫jasypt的加解密方法,實現自定義加解密
import com.zhuiyi.callrete.utils.HttpUtil;
import com.zhuiyi.callrete.utils.KaiserUtil;
import lombok.extern.slf4j.Slf4j;
import org.jasypt.encryption.StringEncryptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
/**
* 重寫jasypt的加解密方法,實現自定義加解密
* @author luokangtao
* @create 2020-01-15 10:29
*/
@Slf4j
@Configuration
@Component("desencrypt")
public class DesEncrypt implements StringEncryptor {
@Value("${jasypt.encryptor.type}")
private String type;
@Value("${jasypt.encrypt.pubkey}")
private String pubkey;
@Value("${jasypt.encrypt.url}")
private String encryptUrl;
@Value("${jasypt.decrypt.url}")
private String decryptUrl;
/**
* 加密
* @param s
* @return
*/
@Override
public String encrypt(String s) {
String encode = "";
if(type!=null && "1".equals(type)){
//國密
try {
//調用遠程服務器方法進行加密
encode = HttpUtil.sendHttpPost(encryptUrl, pubkey);
} catch (Exception e) {
log.info("國密加密失敗");
}
}else {
try {
//本地解密方法
encode= KaiserUtil.decryptKaiser(s, 123456789);
} catch (Exception e) {
log.info("普通加密失敗");
}
}
log.info("加密後的密碼:[{}]",encode);
return encode;
}
/**
* 解密
* @param s
* @return
*/
@Override
public String decrypt(String s) {
String decrypt = "";
if(type!=null && "1".equals(type)){
//國密
try {
//調用遠程服務器方法進行解密
decrypt = HttpUtil.sendHttpPost(decryptUrl, pubkey);
} catch (Exception e) {
log.info("國密解密失敗");
}
}else {
try {
//本地解密方法
decrypt=KaiserUtil.decryptKaiser(s, 123456789);
} catch (Exception e) {
log.info("普通加密失敗");
}
}
log.info("解密成功");
return decrypt;
}
}
第四步:在yml/properties配置文件編寫相關變量屬性
server:
##端口號
port: 9085
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.138.138:3306/luo?useUnicode=true&&characterEncoding=UTF-8
## mysql帳號 用 jasypt加密解密需要用到這種格式: ENC(密文)
username: ENC(춇춄춄춉)
## mysql密碼
password: ENC(쵆쵇쵈쵉쵊쵋)
type: com.alibaba.druid.pool.DruidDataSource
jasypt:
encryptor:
## 實現jasypt加密解密的類
bean: desencrypt
## 0:普通加密 1:國密加密
type: 0
decrypt:
##解密地址
url: http://21.96.45.122:8080/cgb/sm4Decrpt
encrypt:
##加密地址
url: http://21.96.45.122:8080/cgb/sm4Encrypt
##加密/解密祕鑰
pubkey: 0DDDB7576F4AA4226D6FE0DFBEED56C7