java連加密的mysql_Java 實現加密數據庫連接

一、前言

在很多項目中,數據庫相關的配置文件內容都是以明文的形式展示的,這存在一定的安全隱患。

在開發和維護項目時,不僅要關注項目的性能,同時也要注重其安全性。

二、實現思路

我們都知道項目啟動時,Spring 容器會加載配置文件并讀取文件中的內容,那么我們可以下邊步驟操作:

通過 DES 算法加密連接數據庫的賬號和密碼并將加密后的密文寫到 db 配置文件中。

在 Spring 讀取 db 配置文件時將密文解密回明文。

三、實現編碼

3.1 加密工具類

DESUtil 類:

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

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57public class DESUtil {

private static Key key;

private static String KEY_STR = "myKey";

private static String CHARSETNAME = "UTF-8";

private static String ALGORITHM = "DES";

static {

try {

KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");

secureRandom.setSeed(KEY_STR.getBytes());

generator.init(secureRandom);

key = generator.generateKey();

generator = null;

} catch (Exception e) {

throw new RuntimeException(e);

}

}

/**

* 加密

* @param str

* @return

*/

public static String getEncryptString(String str) {

BASE64Encoder base64encoder = new BASE64Encoder();

try {

byte[] bytes = str.getBytes(CHARSETNAME);

Cipher cipher = Cipher.getInstance(ALGORITHM);

cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] doFinal = cipher.doFinal(bytes);

return base64encoder.encode(doFinal);

} catch (Exception e) {

// TODO: handle exception

throw new RuntimeException(e);

}

}

/**

* 解密

* @param str

* @return

*/

public static String getDecryptString(String str) {

BASE64Decoder base64decoder = new BASE64Decoder();

try {

byte[] bytes = base64decoder.decodeBuffer(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) {

throw new RuntimeException(e);

}

}

}

通過上邊的工具類對連接數據庫的賬號密碼進行加密。筆者主機上連接數據庫的賬號和密碼分別是 “root” 和 “tiger”。

經過加密后得到 “WnplV/ietfQ=” 和 “xyHEykQVHqA=” 。

db.properties 配置文件完整內容如下:

1

2

3

4jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=UTC

jdbc.username=WnplV/ietfQ=

jdbc.password=xyHEykQVHqA=

3.2 配置文件解析類

EncryptPropertyPlaceholderConfigurer 類:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {

// 需要解密的字段

private String[] encryptPropNames = { "jdbc.username", "jdbc.password" };

@Override

protected String convertProperty(String propertyName, String propertyValue) {

if (isEncryptProp(propertyName)) {

// 解密

String decryptValue = DESUtil.getDecryptString(propertyValue);

return decryptValue;

} else {

return propertyValue;

}

}

private boolean isEncryptProp(String propertyName) {

for (String encryptpropertyName : encryptPropNames) {

if (encryptpropertyName.equals(propertyName))

return true;

}

return false;

}

}

3.3 Spring 配置文件

applicationContext-mybatis.xml 部分內容:

1

2

3

4

5

6

7

8

9

10

classpath:db.properties

未加密明文前,使用的是 加載 db 配置文件。

加密明文后,使用配置文件解析類加載 db 配置文件。

完成上述 3 個步驟后按照往常操作,直接運行項目即可。

四、總結

起初,在不了解實現思路前覺得這功能很神秘和高大尚。但是,理清思路后功能實現起來就非常簡單了。

作為程序員不能被神秘的表象驚嘆而“望而卻步”,需要學會思考和理清思路,這樣才能不斷提升自身能力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531697.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531697.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531697.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

codeforces Gargari and Bishops(很好的暴力)

1 /*2 題意:給你一個n*n的格子,每一個格子都有一個數值!將兩只bishops放在某一個格子上,3 每一個bishop可以攻擊對角線上的格子(主對角線和者斜對角線),然后會獲得格子上的4 數值&a…

java詞匯速查手冊_java 詞匯表速查手冊

Abstract class 抽象類:抽象類是不允許實例化的類,因此一般它需要被進行擴展繼承。Abstract method 抽象方法:抽象方法即不包含任何功能代碼的方法。Access modifier 訪問控制修飾符:訪問控制修飾符用來修飾Java中類、以及類的方法和變量的訪問控制屬性。Anonymous …

codeforces Gargari and Permutations(DAG+BFS)

1 /*2 題意:求出多個全排列的lcs!3 思路:因為是全排列,所以每一行的每一個數字都不會重復,所以如果有每一個全排列的數字 i 都在數字 j的前面,那么i, j建立一條有向邊!4 …

hdu4292Food(最大流Dinic算法)

/*    題意:每一個人都有喜歡的吃的和喝的,每一個人只選擇一個數量的吃的和一個數量的喝的,問能滿足最多的人數!?    思路:建圖很是重要!f-food, p-people, d-drink    建圖&#x…

python3.5 連接mysql_python3.5 連接mysql本地數據庫

前期準備工作:安裝python的模塊,網上大部分讓安裝mysqldb模塊,但是會報錯,原因是python3.5不被其支持:請看該鏈接 我們也可以這樣解決:直接執行:sudo pip3 install pymysql;在python3中輸入impo…

java異常順序_網易新聞

public class SmallT {public static void main(String args[]) {SmallT t new SmallT();int b t.get();System.out.println(b);}public int get() {try {return 1;} finally {return 2;}}}返回的結果是2。我可以通過下面一個例子程序來幫助我解釋這個答案,從下面…

java中自動裝箱的問題

package wrapper;public class WrapperDemo {public static void main(String[] args) {Integer anew Integer(5);Integer bnew Integer(5);System.out.println(ab);System.out.println(a.equals(b));/*falsetrue*/Integer c127;//屬于自動裝箱Integer d127;//jdk1.5以后&#…

下載國外網站資料需java_Java開發必知道的國外10大網站

1、https://www.google.com/不解釋2、https://stackoverflow.com里面包含各種開發遇到的問題及答案,質量比較高。3、https://github.com/免費的開源代碼托管網站,包括了許多開源的項目及示例項目等。4、https://dzone.com/提供技術新聞、編程教程、及各種…

poj 1950 Dessert(dfs枚舉,模擬運算過程)

/*   這個代碼運行的時間長主要是因為每次枚舉之后都要重新計算一下和的值!    如果要快的話,應該在dfs,也就是枚舉的過程中計算出前邊的數值(這種方法見第二個代碼),直到最后,這樣不必每…

poj1949Chores(建圖或者dp)

1 /*2 題意:n個任務,有某些任務要在一些任務之前完成才能開始做!3 第k個任務的約束只能是1...k-1個任務!問最終需要最少的時間完成全部的 4 任務&#xff0…

java 空數組如何判斷,java判斷數組是否為空

java判斷數組是否為空根據數組長度判斷,如果為0,則為空,反之不是。 (推薦學習:java課程)public class Main {public static void main(String[] args) {int[] array1 new int[]{}; //被當成 {0}if (array1 null) {System.out.pr…

2014牡丹江網絡賽ZOJPretty Poem(暴力枚舉)

/*   將給定的一個字符串分解成ABABA 或者 ABABCAB的形式&#xff01; 思路&#xff1a;暴力枚舉A, B, C串&#xff01; */ 1 #include<iostream>2 #include<cstring>3 #include<cstdio>4 #include<string>5 6 using namespace std;7 str…

php switch goto,PHP goto語句用法實例

問題當 PHP 在執行代碼過程&#xff0c;在某一時刻我們希望它能跳轉到某一特定位置繼續執行代碼&#xff0c;該怎么做呢&#xff1f;回答在 PHP 中&#xff0c;我們可以使用 goto 操作符來使 PHP 代碼執行器跳轉到程序中某一特定位置。goto 的使用有一定限制&#xff0c;如&…

php curl cookie,php中curl獲取返回頁面的cookie

php的curl可以模仿用戶瀏覽網頁并且獲取網頁的cookie,獲取cookie還有專用的參數如CURLOPT_COOKIEJAR 用于保存 cookie 到文件了,下面一起來看幾個例子吧.curl可以獲取返回頁面設置的cookie,原理跟get_headers是一樣的,在返回的頭信息中將"Set-Cookie:"的內容取出來即…

php訪問網頁post獲取源碼,第一次抓別人網站數據,用postman直接請求可以獲取到返回數據,通過代碼的方式就一直報錯,php...

最近需要抓取下KFC的一些數據通過postman把請求地址和參數都拿過來后可以返回數據我就天真的以為可以通過代碼直接發送一個post請求即可但是通過php的curl模擬請求后&#xff0c;返回的一直是服務器異常剛開始時好像成功過&#xff0c;但現在一直都是報這個&#xff0c;我用的就…

c++中關于初始化型參列表的一些問題

1 /*2 1.成員是按照他們在類中出現的順序進行初始化的&#xff0c;而不是按照他們在初始化列表出現的順序初始化的!3 一個好的習慣是&#xff0c;按照成員定義的順序進行初始化。4 2.數組成員在初始化型參列表中不正確 5 */6 #include<iostream>7 #include<cstdio&…

話術php源碼,戀愛話術寶典織夢源碼

戀愛話術寶典網頁版&#xff1a;http://vi.520menghuan.cn戀愛話術寶典app下載&#xff1a;https://www.lanzous.com/i2dmywd戀愛話術寶典app&#xff0c;里面有超過4萬條可復制聊天的戀愛聊天話術&#xff0c;這是一款經典的“智能代聊 APP”。花式套路小哥哥、小姐姐&#xf…

c++中基類與派生類中隱含的this指針的分析

先不要看結果&#xff0c;看一下你是否真正了解了this指針&#xff1f; 1 #include<iostream>2 using namespace std;3 4 class Parent{5 public:6 int x;7 Parent *p;8 public:9 Parent(){} 10 Parent(int x){ 11 …

java中子類與父類中隱含的this引用的分析

/*看一下下面的程序&#xff0c;看是否你的答案和運行的答案是否一致&#xff01; */ class Parent{public int x;public Parent p;public Parent(){}public Parent(int x){this.xx; pthis;}public void f(){System.out.println("Parent::f()"); }public void g(){Sy…

php注冊機制,php自動注冊登錄驗證機制實現代碼_PHP教程

背景&#xff1a;在phpwind站點后臺添加一個名為“廣告管家”(廣告管家為CNZZ的一款廣告投放的應用)的應用&#xff0c;整個“廣告管家”的應用是通過iframe載入&#xff0c;載入的具體內容根據不同站點顯示針對該站點的具體內容&#xff0c;為了提高易用性&#xff0c;有以下的…