日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

MySQL数据库中怎么实现加密

發(fā)布時(shí)間:2023/12/15 综合教程 23 生活家
生活随笔 收集整理的這篇文章主要介紹了 MySQL数据库中怎么实现加密 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇文章將為大家詳細(xì)講解有關(guān)MySQL數(shù)據(jù)庫(kù)中怎么實(shí)現(xiàn)加密,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

如何加密?

對(duì)于 Java 項(xiàng)目來(lái)說(shuō),要想快速實(shí)現(xiàn)數(shù)據(jù)庫(kù)的加密,最簡(jiǎn)單可行的方案就是使用阿里巴巴提供的 Druid 來(lái)實(shí)現(xiàn)加密。

什么是Druid?

Druid(中文譯為“德魯伊”)是阿里巴巴開(kāi)源的一款 Java 語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池。Druid 提供了強(qiáng)大的監(jiān)控和擴(kuò)展功能,當(dāng)然也包含了數(shù)據(jù)庫(kù)的加密功能。

Druid 開(kāi)源地址:https://github.com/alibaba/druid/

Druid可以做什么?

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. Druid 可以監(jiān)控?cái)?shù)據(jù)庫(kù)訪問(wèn)性能,Druid 內(nèi)置提供了一個(gè)功能強(qiáng)大的 StatFilter 插件,能夠詳細(xì)統(tǒng)計(jì) SQL 的執(zhí)行性能,這對(duì)于線上分析數(shù)據(jù)庫(kù)訪問(wèn)性能有幫助。

  3. 替換數(shù)據(jù)庫(kù)連接池 DBCP 和 C3P0,Druid 提供了一個(gè)高效、功能強(qiáng)大、可擴(kuò)展性好的數(shù)據(jù)庫(kù)連接池。

  4. 數(shù)據(jù)庫(kù)密碼加密,直接把數(shù)據(jù)庫(kù)密碼寫在配置文件中,這是不好的行為,容易導(dǎo)致安全問(wèn)題。DruidDruiver 和 DruidDataSource 都支持 PasswordCallback。

  5. SQL 執(zhí)行日志,Druid 提供了不同的 LogFilter,能夠支持 Common-Logging、Log4j 和 JdkLog,你可以按需要選擇相應(yīng)的 LogFilter,監(jiān)控你應(yīng)用的數(shù)據(jù)庫(kù)訪問(wèn)情況。

  6. 擴(kuò)展 JDBC,如果你要對(duì) JDBC 層有編程的需求,可以通過(guò) Druid 提供的 Filter-Chain 機(jī)制,很方便編寫 JDBC 層的擴(kuò)展插件。

對(duì)于本文來(lái)說(shuō),我們重點(diǎn)來(lái)看它的第 3 個(gè)特性,也就是使用 Druid 來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)密碼加密。

加密執(zhí)行流程

在沒(méi)有進(jìn)行密碼加密之前,項(xiàng)目的交互流程是這樣的:

在使用了密碼加密之后,項(xiàng)目的交互流程就變成了這樣:

使用Druid實(shí)現(xiàn)加密

本示例運(yùn)行環(huán)境:

SpringBoot2.4.3MySQL5.7Java1.8Idea2020.1.3

1.添加Druid依賴

Maven 項(xiàng)目:

<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.5</version></dependency>

Gradle 項(xiàng)目:

compile'com.alibaba:druid-spring-boot-starter:1.2.5'

獲取 Druid 最新版本:https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter

2.生成密文

Druid 添加完成之后就可以借助 Druid 中提供的 ConfigTools 類來(lái)加密密碼了,實(shí)現(xiàn)代碼如下:

importcom.alibaba.druid.filter.config.ConfigTools;classMyTests{publicstaticvoidmain(String[]args)throwsException{//需要加密的明文命名Stringpassword="youPassword";//【注意:這里要改為你自己的密碼】//調(diào)用druid生成私鑰、公鑰、密文ConfigTools.main(newString[]{password});}}

以上代碼執(zhí)行的結(jié)果如下:

privateKey:MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEApOjcMWSDzJiKVGmtcBBoQPtM9tVW2H2cnS6xZK7NrbzQXYWLQD2zefIrrx9vMvqRIHEqkmAHTuUcUXHgCxu0cwIDAQABAkAlqo5ItdWo0Jqf5zdXJlg5p2yP4HCiqCYyfKzF+2s9KEmgWZJWTctZDsgQ0iYUohORR59I+J4nabhel1x5/INpAiEA6jwSyFqMUPOh2XlrzNFek+RthOQ5n4+ALPo+vULayO0CIQC0O7JM9sIq+tg+jCGv+ypk6vbuRKY9m5W2rSRXapGm3wIgRHul3jAjIDPrF/f1HaAFL+Y0Yws7Ebyp8/yCRWF7iA0CIALbe20q8FMcHPeI4zPWCIsHCpkmb3hEkjAOOKhGIT8DAiAqiUuz92NqKeyjmOfons1ka65EzVwA3NDhZ6+IQcnuig==publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKTo3DFkg8yYilRprXAQaED7TPbVVth9nJ0usWSuza280F2Fi0A9s3nyK68fbzL6kSBxKpJgB07lHFFx4AsbtHMCAwEAAQ==password:IMgKm27bOHok3/+5aDL4jGBoVVZkpicbbM6pIXQppi3dI7h4jngSAqhqwqYnfuYpyVJ0k++q9xWWnHtd6sAWnQ==

從上述結(jié)果可以看出,使用 ConfigTools 類會(huì)生成 3 部分的內(nèi)容:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. privateKey:私鑰,暫時(shí)不會(huì)用到,用于密碼的加密;

  3. publicKey:公鑰,用于密碼的解密;

  4. password:加密之后的密碼。

  • PS:要實(shí)現(xiàn)數(shù)據(jù)庫(kù)的加密,主要使用的是 publicKey(公鑰)和 password(密文),這就把明文轉(zhuǎn)換成密文了。

3.添加配置

完成了以上操作之后,只需要將上一步生成的公鑰和密文添加到項(xiàng)目的配置文件 application.yml(或application.xml)中就實(shí)現(xiàn)了加密操作了,具體配置信息如下:

spring:#MySQL配置datasource:driver-class-name:com.mysql.cj.jdbc.Drivertype:com.alibaba.druid.pool.DruidDataSourcedruid:url:jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useSSL=falseusername:rootpassword:IMgKm27bOHok3/+5aDL4jGBoVVZkpicbbM6pIXQppi3dI7h4jngSAqhqwqYnfuYpyVJ0k++q9xWWnHtd6sAWnQ==#encryptconfigfilters:configconnect-properties:config.decrypt:trueconfig.decrypt.key:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKTo3DFkg8yYilRprXAQaED7TPbVVth9nJ0usWSuza280F2Fi0A9s3nyK68fbzL6kSBxKpJgB07lHFFx4AsbtHMCAwEAAQ==

其中 password 對(duì)應(yīng)的是上一步生成的 password(密文),而 config.decrypt.key 對(duì)應(yīng)的是上一步生成的 publicKey(公鑰),如下圖所示:

這里提供一個(gè)原始的配置文件,以便和加密后的配置文件進(jìn)行比對(duì):

4.注意事項(xiàng)-插著鑰匙的鎖

經(jīng)過(guò)前面 3 步的配置之后,我們的程序就可以正常運(yùn)行了,但這遠(yuǎn)沒(méi)有結(jié)束!

在第 3 步配置時(shí),我們將密文和公鑰都寫入配置文件,這就會(huì)造成當(dāng)有人拿到密文和公鑰之后,就可以使用 Druid 將加密的密碼還原出來(lái)了,這就好比一把插著鑰匙的鎖是極不安全的。

因此我們正確的使用姿勢(shì):是將公鑰找一個(gè)安全的地方保存起來(lái),每次在項(xiàng)目啟動(dòng)時(shí)動(dòng)態(tài)的將公鑰設(shè)置到項(xiàng)目中,這樣就可以有效的保證密碼的安全了。

正確的配置文件

接下來(lái)我們將 Spring Boot 的公鑰設(shè)置為配置項(xiàng),在項(xiàng)目運(yùn)行時(shí)再替換為具體的值,最終的安全配置信息如下:

spring:#MySQL配置datasource:driver-class-name:com.mysql.cj.jdbc.Drivertype:com.alibaba.druid.pool.DruidDataSourcedruid:url:jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useSSL=falseusername:rootpassword:IMgKm27bOHok3/+5aDL4jGBoVVZkpicbbM6pIXQppi3dI7h4jngSAqhqwqYnfuYpyVJ0k++q9xWWnHtd6sAWnQ==#encryptconfigfilters:configconnect-properties:config.decrypt:trueconfig.decrypt.key:${spring.datasource.druid.publickey}

可以看出公鑰被修改成“${spring.datasource.druid.publickey}”了,這就相當(dāng)于使用占位符先把坑給占上,等項(xiàng)目啟動(dòng)時(shí)再更換上具體的值。

  • PS:“spring.datasource.druid.publickey”并非是固定不可變的 key,此 key 值用戶可自行定義。

開(kāi)發(fā)環(huán)境替換公鑰

開(kāi)發(fā)環(huán)境只需要在 Idea 的啟動(dòng)參數(shù)中配置公鑰的值即可,如下圖所示:

當(dāng)我們輸入正確的公鑰值時(shí)程序可以正常運(yùn)行,當(dāng)輸入一個(gè)錯(cuò)誤的公鑰值時(shí)就會(huì)提示解碼失敗,如下圖所示:

生產(chǎn)環(huán)境替換公鑰

生產(chǎn)環(huán)境在啟動(dòng) jar 包時(shí)只需要?jiǎng)討B(tài)設(shè)置公鑰的值即可,參考以下命令:

java-jarxxx.jar--spring.datasource.druid.publickey=你的公鑰

Druid運(yùn)行原理經(jīng)過(guò)上述步驟之后,我們就完成 MySQL 密碼的加密了,這樣當(dāng) Spring Boot 項(xiàng)目啟動(dòng)時(shí),Druid 的攔截器會(huì)使用密文和公鑰將密碼還原成真實(shí)的密碼以供項(xiàng)目使用,當(dāng)然這一切都無(wú)需人工干預(yù)(無(wú)需編寫任何代碼),Druid 已經(jīng)幫我封裝好了,我們只需要通過(guò)以上配置即可。

什么?你想知道 Druid 是如何通過(guò)密文和公鑰還原出真實(shí)的密碼的?

沒(méi)問(wèn)題,滿足你,其實(shí) ConfigTools 類中已經(jīng)提供了相應(yīng)實(shí)現(xiàn),代碼如下:

//密文Stringpassword="VwH1mu2IUpqjfKTd+gSikiZgJTi+3Y5zFIFRfxYnH1UqHzm1K8TIHnMaV3TErBaGsVEaGV0e63pb0Ys3Wdm7Kg==";//公鑰StringpublicKey="MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALWIEp19IM04sB+vQXnEOH9gFNFdL5TFGSEhORgHj4MnfTfBSNaOoSgCaM8BOpjiHmwuEb7LpvmXI1x/ymUvNzECAwEAAQ==";//還原成真實(shí)的密碼Stringresult=ConfigTools.decrypt(publicKey,password);System.out.println("最終結(jié)果:"+result);

總結(jié)

以上是生活随笔為你收集整理的MySQL数据库中怎么实现加密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。