最近工作上面源掃掃到密碼 Hard Code 程式,有人提供使用 Jasypt 作加密動作,不過,就算改成從 DB 撈出來也會抓到這個問題,所以用 Jasypt 能不能掃到?我也不是很清楚。
這邊我就簡單做個紀錄。
了解怎麼載入 properties(與標題無關)
這邊跟加密沒有關係,但先了解怎麼從 Spring 載入 properties
設定
方法一 (context:property-placeholder )
1
|
<context:property-placeholder location="classpath:system.properties" />
|
<context:property-placeholder>
標簽提供了一種優雅的外在化參數配置的方式,不過該標簽在Spring配置文件中只能存在一份!!!
眾所周知,Spring容器是采用反射掃描的發現機制,通過標簽的命名空間實例化實例,當Spring探測到容器中有一個org.springframework.beans.factory.config.PropertyPlaceholderCVonfigurer的Bean就會停止對剩余PropertyPlaceholderConfigurer的掃描,即只能存在一個實例!
參考: Spring配置文件context:property-placeholder標簽使用漫談 - IT閱讀
1
2
3
4
5
6
7
8
9
10
11
12
|
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!-- 對於讀取一個配置檔案採取的方案 -->
<!--<property name="location" value="classpath:db.properties"/>-->
<!--對於讀取多個配置檔案採取的方案-->
<property name="locations">
<list>
<value>classpath:db.properties</value>
<value>classpath:db2.properties</value>
</list>
</property>
</bean>
|
這邊Jaspty 會用這個!! Jaspty 裡面的 EncryptablePropertyPlaceholderConfigurer 繼承這個物件,我們可以使用@value
去抓出資料。
更多方法
- 五种方式让你在java中读取properties文件内容不再是难题 - 阿豪聊干货 - 博客园 TODO: 備份
- spring- properties 讀取的五種方式 | IT人
- Java程式碼中獲取配置檔案(config.properties)中內容的兩種方法 - IT閱讀
- Spring註解@Value及屬性載入組態檔方式 - IT145.com
讀取值方法
@value
1
2
3
4
5
|
@Value("${item.specKey}")
private String SPEC_KEY ;
@Value("${item.saltvalueStr}")
private String SALTVALUE_STR ;
|
讀取方法
1
2
3
4
|
<bean id="xxx" class="xxxxx">
<property name="SPEC_KEY" value="${item.specKey}" />
<property name="SALTVALUE_STR" value="${item.saltvalueStr}" />
</bean>
|
properties
1
2
|
item.specKey=Test
item.saltvalueStr=Test
|
Jasypt 加密動作
jasypt
1
2
3
4
5
|
<dependency>
<groupId>org.jasypt</groupId>
<artifactId>jasypt</artifactId>
<version>1.9.3</version>
</dependency>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
<bean id="jasyptConf" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
<property name="algorithm" value="PBEWithMD5AndDES" />
<property name="password" value="********" />
</bean>
<bean id="jasyptEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
<property name="config" ref="jasyptConf" />
</bean>
<bean id="propertyConfigurer" class="org.jasypt.spring4.properties.EncryptablePropertyPlaceholderConfigurer">
<constructor-arg ref="jasyptEncryptor" />
<property name="locations">
<list>
<value>classpath*:com/project/npp/persistence/cfg/jdbc.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>
|
1
2
3
4
5
|
jdbc.driverClassName=com.ibm.db2.jcc.DB2Driver
jdbc.username=nppuser1
jdbc.password=ENC(fAObzokoh7ldKBiVU16pqSdPeURziFjb)
|
如何產生 Jasypt 加密key?
官網抓的jar 檔,下已下指令可以得出
1
2
|
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="myPassword" password=privatekey algorithm=PBEWithMD5AndDES
|
還有一個方法是用官方 shell script 去產生Releases · jasypt/jasypt · GitHub,這邊就不特別做紀錄,網路很多是用這個方法。