数据库安全加密是保护敏感数据免受未授权访问的重要手段。以下是一个详细深入的步骤,介绍如何进行数据库安全加密,包括数据传输加密和数据存储加密。

一. 数据传输加密

确保数据在传输过程中被加密,以防止中间人攻击。我们以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…