MySQL(117)何進行數據庫安全加密?

數據庫安全加密是保護敏感數據免受未授權訪問的重要手段。以下是一個詳細深入的步驟,介紹如何進行數據庫安全加密,包括數據傳輸加密和數據存儲加密。

一. 數據傳輸加密

確保數據在傳輸過程中被加密,以防止中間人攻擊。我們以MySQL為例,介紹如何啟用SSL/TLS加密通信。

1. 生成SSL證書

首先,生成服務器和客戶端的SSL證書。可以使用OpenSSL生成這些證書。

# 創建服務器密鑰和證書
openssl genrsa -out server-key.pem 2048
openssl req -new -key server-key.pem -out server-req.pem
openssl x509 -req -in server-req.pem -days 365 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem# 創建客戶端密鑰和證書
openssl genrsa -out client-key.pem 2048
openssl req -new -key client-key.pem -out client-req.pem
openssl x509 -req -in client-req.pem -days 365 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
2. 配置MySQL使用SSL

編輯MySQL配置文件(通常位于/etc/mysql/mysql.conf.d/mysqld.cnf),添加以下配置:

[mysqld]
ssl-ca=/path/to/ca-cert.pem
ssl-cert=/path/to/server-cert.pem
ssl-key=/path/to/server-key.pem

重啟MySQL服務:

sudo systemctl restart mysql
3. 客戶端連接MySQL時使用SSL

在Java應用程序中使用JDBC連接MySQL時,配置SSL選項:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class SSLConnectionExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydb?useSSL=true&requireSSL=true&verifyServerCertificate=true";String user = "root";String password = "password";try (Connection conn = DriverManager.getConnection(url, user, password)) {System.out.println("Connected to the database with SSL");} catch (SQLException e) {e.printStackTrace();}}
}

二. 數據存儲加密

確保數據在存儲過程中被加密,以防止數據泄露。我們可以使用加密庫(如JCE)在應用層進行數據加密。

1. 使用Java加密庫(JCE)進行加密

下面是一個示例,介紹如何使用Java加密庫(JCE)進行數據加密和解密:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;public class DataEncryption {private static final String ALGORITHM = "AES";private static final String TRANSFORMATION = "AES";public static void main(String[] args) throws Exception {String originalData = "Sensitive Data";SecretKey secretKey = generateKey();String encryptedData = encrypt(originalData, secretKey);System.out.println("Encrypted Data: " + encryptedData);String decryptedData = decrypt(encryptedData, secretKey);System.out.println("Decrypted Data: " + decryptedData);}public static SecretKey generateKey() throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);keyGenerator.init(256); // AES 256 bits keyreturn keyGenerator.generateKey();}public static String encrypt(String data, SecretKey key) throws Exception {Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.ENCRYPT_MODE, key);byte[] encryptedBytes = cipher.doFinal(data.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}public static String decrypt(String encryptedData, SecretKey key) throws Exception {Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.DECRYPT_MODE, key);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));return new String(decryptedBytes);}
}
2. 存儲加密數據到數據庫

將加密后的數據存儲到數據庫中:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;import javax.crypto.SecretKey;@Service
public class EncryptionService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Autowiredprivate DataEncryption dataEncryption;public void storeEncryptedData(String data, SecretKey key) throws Exception {String encryptedData = dataEncryption.encrypt(data, key);String sql = "INSERT INTO encrypted_data (data) VALUES (?)";jdbcTemplate.update(sql, encryptedData);}public String retrieveDecryptedData(int id, SecretKey key) throws Exception {String sql = "SELECT data FROM encrypted_data WHERE id = ?";String encryptedData = jdbcTemplate.queryForObject(sql, new Object[] {id}, String.class);return dataEncryption.decrypt(encryptedData, key);}
}
3. 使用JPA存儲加密數據

使用JPA時,可以創建一個自定義屬性轉換器來自動加密和解密數據:

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.util.Base64;@Converter
public class AttributeEncryptor implements AttributeConverter<String, String> {private final SecretKey key;public AttributeEncryptor() {String encodedKey = "your-256-bit-base64-encoded-key";byte[] decodedKey = Base64.getDecoder().decode(encodedKey);this.key = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");}@Overridepublic String convertToDatabaseColumn(String attribute) {try {return DataEncryption.encrypt(attribute, key);} catch (Exception e) {throw new RuntimeException("Error occurred during encryption", e);}}@Overridepublic String convertToEntityAttribute(String dbData) {try {return DataEncryption.decrypt(dbData, key);} catch (Exception e) {throw new RuntimeException("Error occurred during decryption", e);}}
}

使用轉換器的實體類:

import javax.persistence.*;@Entity
public class EncryptedEntity {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Convert(converter = AttributeEncryptor.class)private String sensitiveData;// getters and setters
}

三. 數據庫級別加密

有些數據庫管理系統(DBMS)本身也提供了數據加密功能,如MySQL的TDE(Transparent Data Encryption)和MongoDB的加密存儲引擎。

1. MySQL TDE配置

MySQL支持透明數據加密(TDE),可以對整個表空間進行加密。以下是如何啟用MySQL TDE的示例:

-- 先確保MySQL版本支持TDE
SHOW VARIABLES LIKE 'version';-- 創建加密密鑰
ALTER INSTANCE ROTATE INNODB MASTER KEY;-- 創建加密表空間
CREATE TABLESPACE encrypted_tablespace ADD DATAFILE 'encrypted.ibd' ENCRYPTION='Y';-- 創建加密表
CREATE TABLE encrypted_table (id INT PRIMARY KEY, data VARCHAR(255)) TABLESPACE=encrypted_tablespace;

總結

以上方法涵蓋了如何在應用程序層、傳輸層和數據庫層對數據進行加密。通過結合這些方法,可以有效地保護敏感數據,防止未授權訪問和數據泄露。為了確保最高的安全性,建議根據具體需求和環境選擇適合的加密策略,并定期更新和審查安全措施。

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

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

相關文章

工程化實踐——標準化Eslint、PrettierTS

前端工程化中的標準化工具&#xff08;如Prettier、ESLint、Husky等&#xff09;雖然大幅提升了開發效率和代碼質量&#xff0c;但在實際使用中也存在一些限制和挑戰。以下從工具特性、團隊協作、開發體驗等維度詳細分析常見限制&#xff0c;并以Prettier為核心舉例說明&#x…

應急響應靶場——web3 ——知攻善防實驗室

前景需要&#xff1a; 小苕在省護值守中&#xff0c;在靈機一動情況下把設備停掉了&#xff0c;甲方問&#xff1a;為什么要停設備&#xff1f;小苕說&#xff1a;我第六感告訴我&#xff0c;這機器可能被黑了。這是他的服務器&#xff0c;請你找出以下內容作為通關條件&#…

Ubuntu:Tomcat里面的catalina.sh

認識catalina.sh 1 啟動Tomcat catalina.sh start相當于startup.sh 2 停止Tomcat catalina.sh stop相當于shutdown.sh 3 前臺運行Tomcat 一般用于調試 catalina.sh run4 Tomcat腳本 編輯如下腳本run_tomcat.sh 里面的一些HOME位置改成自己的 #!/bin/shWORKDIR$(cd $(dirname $0…

【機器學習深度學習】模型微調時的4大基礎評估指標(1)

目錄 前言&#xff1a;基礎評估指標&#xff08;從 “對與錯” 到 “準與全”&#xff09; 一、基礎評估4大指標 二、類比理解 2.1 準確率&#xff08;Accuracy&#xff09;&#xff1a;整體對的比例 2.2 精確率&#xff08;Precision&#xff09;&#xff1a;你說是垃圾的…

關于 棧幀變化完整流程圖(函數嵌套)

一、什么是棧幀&#xff08;Stack Frame&#xff09; 當一個函數被調用時&#xff0c;會在棧上開辟一段空間&#xff0c;叫做 棧幀。 每個棧幀保存了&#xff1a; 函數的參數 返回地址&#xff08;從哪里跳回來&#xff09; 上一個棧幀的棧底指針&#xff08;保存調用者的 E…

new與malloc[c++面試系列]

new與malloc的區別new順從c的思想&#xff0c;在堆區申請一個對象&#xff0c;因此它會調用對象的構造函數進行初始化&#xff0c;它也應該調用構造函數&#xff1b;malloc在堆區申請一塊空間&#xff0c;用于存放資源new無需指定對象大小&#xff0c;可以自動計算對象大小進行…

Go語言的sync.Once和sync.Cond

一.sync.OnceOnce&#xff08;單次執行&#xff09;用途&#xff1a;確保某個操作只執行一次&#xff08;如初始化配置&#xff09;核心方法&#xff1a;Do(f func())&#xff1a;保證 f只執行一次package mainimport ("fmt""sync" )var (config map[strin…

java整合itext pdf實現自定義PDF文件格式導出

springBoot結合itext pdf實現自定義PDF文件格式導出背景需求&#xff1a;使用PDF導出指定人員對應周次的打卡記錄&#xff0c;每周對應星期幾打卡過就打“√”。如下圖&#xff1a;1、導入依賴導入itextpdf依賴<!-- itex PDF --> <dependency><groupId>…

從0開始學習計算機視覺--Day07--神經網絡

當我們輸入的變量是一個比較大的向量&#xff08;比如有4096項&#xff09;&#xff0c;函數是求返回輸入的最大值&#xff0c;要求的權重矩陣的梯度就是4096 * 4096的大小&#xff0c;而實際上我們的輸入往往都不只有一個向量&#xff0c;那如果向量有一百個的話&#xff0c;是…

MySQL存儲過程全解析

1、存儲過程的概念 存儲過程是事先經過編譯并存儲在數據庫中的一段sql語句的集合&#xff0c;調用存儲過程可以簡化應用開發人員的很多工作&#xff0c;減少數據在數據庫和應用服務器之間的傳輸&#xff0c;對于提高數據處理效率是很有好處。 2、存儲過程的優點 存儲過程是通…

后端密碼加密:守護用戶數據的鋼鐵長城

&#x1f512;“系統被拖庫了&#xff01;” 這可能是開發者最恐懼的噩夢。而當用戶密碼以明文暴露時&#xff0c;災難將席卷每個用戶——密碼重用的慣性會讓黑客輕松攻破他們在其他平臺的賬戶。作為后端開發者&#xff0c;我們握有守護用戶安全的第一道鑰匙&#xff1a;科學的…

Flutter 3.29+使用isar構建失敗

執行命令&#xff1a;flutter build apk --release 報錯 Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source!FAILURE: Build failed with an exception. …

SQL 轉 Java 實體類工具

拿到數據庫建表語句后怎么高效寫 Java 實體類&#xff1f;這款工具直接幫你全自動生成&#xff01; 作為一名后端 Java 工程師&#xff0c;你是不是也經歷過以下情況&#xff1a; ? 拿到一份完整的建表 SQL&#xff0c;卻要手動寫 Java Bean ? 字段幾十個&#xff0c;嵌套復…

創客匠人視角下:創始人 IP 打造與知識變現的深度耦合路徑

在知識經濟蓬勃發展的當下&#xff0c;創始人 IP 打造與知識變現的融合已成為行業破局關鍵。創客匠人作為深耕知識付費賽道多年的服務平臺&#xff0c;其創始人老蔣提出的 “土壤構建能力” 理論&#xff0c;為理解這一融合邏輯提供了獨特視角。從本質來看&#xff0c;創始人 I…

【網絡協議安全】任務13:ACL訪問控制列表

目錄 一、概念 1、前言 2、應用場景 3、ACL分類 基于ACL標識方法的劃分 基于對IPv4和IPv6支持情況的劃分 基于ACL規則定義方式的劃分 4、ACL的基本原理 ACL的組成 ACL的匹配機制 5、ACL常用匹配原則 6、ACL常用的匹配項 生效時間段 IP承載的協議類型 源/目的IP…

TensorFlow 安裝使用教程

一、TensorFlow 簡介 TensorFlow 是由 Google 開發的開源深度學習框架&#xff0c;支持數據流圖計算&#xff0c;可運行于 CPU/GPU/TPU。它被廣泛應用于語音識別、圖像處理、自然語言處理等多個 AI 領域。 二、安裝 TensorFlow 2.1 pip 安裝&#xff08;默認 CPU 版本&#x…

騰訊云認證考試報名 - TDSQL數據庫交付運維專家(TCCE MySQL版)

數據庫交付運維專家- 騰訊云TDSQL(MySQL版) 適合人群&#xff1a; 適合TDSQL(MySQL版)各組件擴縮容、運維、性能優化、故障解決、壓力測試等數據庫開發、運維、管理人員。 認證考試&#xff1a; 單選*40道多選*20道上機*20道 考試時長&#xff1a; 理論考試120分鐘,上機考試…

webUI平替應用,安裝簡單,功能齊全

前言 在安裝本地大模型后&#xff0c;我們都會為大模型安裝一個用戶界面&#xff0c;這樣就可以實現語音輸入&#xff0c;對話保存&#xff0c;微調&#xff0c;構建本地知識庫等高階功能。 目前最火的本地大模型UI&#xff0c;就是gihub上的webUI&#xff0c;但他不僅依賴較…

【Maven】Maven核心機制的 萬字 深度解析

Maven核心機制的萬字深度解析一、依賴管理機制全解&#xff08;工業級依賴治理方案&#xff09;1. 坐標體系的本質與設計哲學2. 依賴傳遞與仲裁算法的工程實現**沖突仲裁核心算法**企業級仲裁策略3. Scope作用域的類加載隔離原理4. 多級倉庫體系架構設計二、構建生命周期底層原…

暑期前端訓練day4

今天主要是有關周賽的&#xff0c;比賽的時候是用c寫的并且是 ak了&#xff0c;但是就是想用js再復盤一下&#xff0c;也不能只是圖一時之爽&#xff0c;如果是換在實際的場景里面我是不是只會用 c快速寫出來。 最近也要從js逐漸轉向ts&#xff0c;感覺Ts才是主旋律&#xff0c…