SpringBoot配置文件屬性加密

摘要

添加依賴

implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.3'

配置文件

jasypt:
  encryptor:
    #默認加密算法:PBEWITHHMACSHA512ANDAES_256鱼蝉,sha512+AES算法汞斧,安全性更高并巍,但是需要 Java JDK 1.9+
    #本服務(wù)使用jdk1.8,所以使用 PBEWithMD5AndDES md5+des算法
    #默認使用 com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor 進行加解密 熟呛,PooledPBEStringEncryptor可以對其加密的內(nèi)容進行解密
    algorithm: PBEWithMD5AndDES
    # 加密密鑰广辰,使用方式 spring.datasource.password=ENC(密文),不要設(shè)置在配置文件中蔗崎,建議使用環(huán)境變量或者啟動參數(shù): --jasypt.encryptor.password=123456
    password: 123456
    #設(shè)置密文前綴和后綴
    property:
      prefix: ENC(
      suffix: )
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator

可用屬性

Key Required Default Value
jasypt.encryptor.password True -
jasypt.encryptor.algorithm False PBEWITHHMACSHA512ANDAES_256
jasypt.encryptor.key-obtention-iterations False 1000
jasypt.encryptor.pool-size False 1
jasypt.encryptor.provider-name False SunJCE
jasypt.encryptor.provider-class-name False null
jasypt.encryptor.salt-generator-classname False org.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.iv-generator-classname False org.jasypt.iv.RandomIvGenerator
jasypt.encryptor.string-output-type False base64
jasypt.encryptor.proxy-property-sources False false
jasypt.encryptor.skip-property-sources False empty list

生成密文

# jar下載地址:https://repo1.maven.org/maven2/org/jasypt/jasypt/1.9.3/jasypt-1.9.3.jar
# 實際上使用maven或者gradle配置jasypt-spring-boot-starter依賴后,這個jar就已經(jīng)下載到本地倉庫了侠坎,去本地倉庫找找吧
#加密
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI password=123456 algorithm=PBEWithMD5AndDES ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator input=newpwd

#解密
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI password=123456 algorithm=PBEWithMD5AndDES ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator input=BwNPdUi+syCTKFj/nlbI5fAtGUKuhN8r

屬性加密

spring:
#數(shù)據(jù)源配置
  datasource:
    url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&useTimezone=true&serverTimezone=GMT%2B8
    username: root
    password: ENC(BwNPdUi+syCTKFj/nlbI5fAtGUKuhN8r)
    driver-class-name: com.mysql.cj.jdbc.Driver

  #配置redis連接
  redis:
    host: 127.0.0.1
    password: ENC(FE4cpSc+2u9NFEY+Q5n9kNSxW6BUiNXGNTUPuhoQbPA=)

說明

  • 配置文件將需要加密的屬性使用ENC(密文)的方式進行配置蚁趁,密文前綴和后綴可以在配置文件中進行配置
  • jasypt-spring-boot-starter在服務(wù)運行時會自動對密文進行解密處理

密鑰傳遞方式

#1.啟動參數(shù)
java -jar jasypt-spring-boot-demo.jar --jasypt.encryptor.password=password

#2.系統(tǒng)屬性
java -Djasypt.encryptor.password=password -jar jasypt-spring-boot-demo.jar

#3.環(huán)境變量
jasypt:
    encryptor:
        password: ${JASYPT_ENCRYPTOR_PASSWORD:}

JASYPT_ENCRYPTOR_PASSWORD=password java -jar jasypt-spring-boot-demo.jar

#也可以先設(shè)置環(huán)境變量
export JASYPT_ENCRYPTOR_PASSWORD=password
java -jar jasypt-spring-boot-demo.jar

代碼中使用Jasypt

/**
* 引入jasypt-spring-boot-starter就會自動注入
*/
@Resource
private StringEncryptor stringEncryptor;

public void StringEncryptor() {
    String encrypt = stringEncryptor.encrypt("newpwd");
    System.out.println(encrypt);

    String decrypt = stringEncryptor.decrypt(encrypt);
    System.out.println(decrypt);
}

非springboot項目

依賴

implementation 'org.jasypt:jasypt:1.9.3'

工具類

package com.example.utils;

import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;

/**
 * <h1>屬性加密工具類</h1>
 */
public class JasyptUtil {

    public static String encrypt(String secretKey, String message) {
        return stringEncryptor(secretKey, message, true);
    }

    public static String decrypt(String secretKey, String message) {
        return stringEncryptor(secretKey, message, false);
    }

    /**
     * {@link StringEncryptor} 加解密。
     * 同一個密鑰(secretKey)對同一個內(nèi)容執(zhí)行加密实胸,生成的密文都是不一樣的他嫡,但是根據(jù)根據(jù)這些密文解密成明文都是可以.
     * 1、Jasypt 默認使用 {@link StringEncryptor} 來解密全局配置文件中的屬性庐完,所以提供密文時钢属,也需要提供 {@link StringEncryptor} 加密的密文
     * 2、{@link StringEncryptor} 接口有很多的實現(xiàn)類门躯,比如常用的 {@link PooledPBEStringEncryptor}
     * 3淆党、setConfig(final PBEConfig config):為對象設(shè)置 {@link PBEConfig} 配置對象
     * 4、encrypt(final String message):加密內(nèi)容
     * 5讶凉、decrypt(final String encryptedMessage):解密內(nèi)容
     *
     * @param secretKey :密鑰染乌。加/解密必須使用同一個密鑰
     * @param message   :加/解密的內(nèi)容
     * @param isEncrypt :true 表示加密、false 表示解密
     * @return
     */
    private static String stringEncryptor(String secretKey, String message, boolean isEncrypt) {
        PooledPBEStringEncryptor pooledPBEStringEncryptor = new PooledPBEStringEncryptor();
        pooledPBEStringEncryptor.setConfig(getSimpleStringPBEConfig(secretKey));
        String result = isEncrypt ? pooledPBEStringEncryptor.encrypt(message) : pooledPBEStringEncryptor.decrypt(message);
        return result;
    }

    /**
     * 設(shè)置 {@link PBEConfig} 配置對象懂讯,SimpleStringPBEConfig 是它的實現(xiàn)類
     * 1荷憋、所有的配置項建議與全局配置文件中的配置項保持一致,特別是 password褐望、algorithm 等等選項勒庄,如果不一致,則應(yīng)用啟動時解密失敗而報錯.
     * 2瘫里、setPassword(final String password):設(shè)置加密密鑰实蔽,必須與全局配置文件中配置的保存一致,否則應(yīng)用啟動時會解密失敗而報錯.
     * 3谨读、setPoolSize(final String poolSize):設(shè)置要創(chuàng)建的加密程序池的大小.
     * 4局装、setAlgorithm(final String algorithm): 設(shè)置加密算法的值, 此算法必須由 JCE 提供程序支持
     * 5劳殖、setKeyObtentionIterations: 設(shè)置應(yīng)用于獲取加密密鑰的哈希迭代次數(shù)贼邓。
     * 6、setProviderName(final String providerName):設(shè)置要請求加密算法的安全提供程序的名稱
     * 7闷尿、setSaltGeneratorClassName:設(shè)置 Sal 發(fā)生器
     * 8塑径、setIvGeneratorClassName:設(shè)置 IV 發(fā)生器
     * 9、setStringOutputType:設(shè)置字符串輸出的編碼形式填具⊥骋ǎ可用的編碼類型有 base64匆骗、hexadecimal
     *
     * @param secretKey
     * @return
     */
    private static SimpleStringPBEConfig getSimpleStringPBEConfig(String secretKey) {
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(secretKey);
        config.setAlgorithm("PBEWithMD5AndDES");
        //以下都是默認值
        config.setPoolSize("1");
        config.setKeyObtentionIterations("1000");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        //命令行執(zhí)行時要指定這個參數(shù)
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64");
        return config;
    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市誉简,隨后出現(xiàn)的幾起案子碉就,更是在濱河造成了極大的恐慌,老刑警劉巖闷串,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓮钥,死亡現(xiàn)場離奇詭異,居然都是意外死亡烹吵,警方通過查閱死者的電腦和手機碉熄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肋拔,“玉大人锈津,你說我怎么就攤上這事×狗洌” “怎么了琼梆?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窿吩。 經(jīng)常有香客問我茎杂,道長,這世上最難降的妖魔是什么纫雁? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任煌往,我火速辦了婚禮,結(jié)果婚禮上先较,老公的妹妹穿的比我還像新娘携冤。我一直安慰自己悼粮,他們只是感情好闲勺,可當(dāng)我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扣猫,像睡著了一般菜循。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上申尤,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天癌幕,我揣著相機與錄音,去河邊找鬼昧穿。 笑死勺远,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的时鸵。 我是一名探鬼主播胶逢,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼厅瞎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了初坠?” 一聲冷哼從身側(cè)響起和簸,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碟刺,沒想到半個月后锁保,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡半沽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年爽柒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抄囚。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡霉赡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幔托,到底是詐尸還是另有隱情穴亏,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布重挑,位于F島的核電站嗓化,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谬哀。R本人自食惡果不足惜刺覆,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望史煎。 院中可真熱鬧谦屑,春花似錦、人聲如沸篇梭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恬偷。三九已至悍手,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袍患,已是汗流浹背坦康。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诡延,地道東北人滞欠。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像肆良,于是被迫代替她去往敵國和親筛璧。 傳聞我的和親對象是個殘疾皇子赤兴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,446評論 2 359