MySQL敏感数据进行加密的几种方法

  1. 使用MySQL内置的加密函数

    • AES_ENCRYPT和AES_DECRYPT函数
      • 方法介绍
        • AES(Advanced Encryption Standard)是一种对称加密算法。在MySQL中,可以使用AES_ENCRYPT函数对数据进行加密,使用AES_DECRYPT函数进行解密。这种加密方式的特点是加密和解密使用相同的密钥。
      • 示例
        • 首先,创建一个表来存储加密后的数据:
          CREATE TABLE encrypted_data (id INT AUTO_INCREMENT PRIMARY KEY,encrypted_text BLOB
          );
          
        • 然后,假设要加密的文本是'Sensitive Information',密钥是'MySecretKey',插入加密后的数据:
          SET @sensitive_text = 'Sensitive Information';
          SET @encryption_key = 'MySecretKey';
          INSERT INTO encrypted_data (encrypted_text)
          VALUES (AES_ENCRYPT(@sensitive_text, @encryption_key));
          
        • 当需要读取数据时,进行解密:
          SELECT AES_DECRYPT(encrypted_text, @encryption_key)
          FROM encrypted_data;
          
    • MD5函数(单向加密,用于验证)
      • 方法介绍
        • MD5是一种单向加密哈希函数,它将任意长度的数据转换为固定长度(128位)的哈希值。由于它是单向的,无法从哈希值还原出原始数据。通常用于验证数据是否被篡改,例如存储用户密码的哈希值,在用户登录时比较输入密码的哈希值和存储的哈希值是否一致。
      • 示例
        • 假设存储用户密码,创建一个表:
          CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50),password_hash VARCHAR(32)
          );
          
        • 当用户注册时,计算密码的MD5哈希值并存储:
          SET @password = 'UserPassword';
          SET @password_hash = MD5(@password);
          INSERT INTO users (username, password_hash)
          VALUES ('User', @password_hash);
          
        • 在用户登录时,验证密码:
          SET @input_password = 'UserPassword';
          SET @stored_password_hash = (SELECT password_hash FROM users WHERE username = 'User');
          IF MD5(@input_password) = @stored_password_hash THENSELECT 'Password is correct';
          ELSESELECT 'Password is incorrect';
          END IF;
          
        • 需要注意的是,由于MD5存在碰撞等安全隐患,在安全性要求较高的场景下,现在更推荐使用如SHA - 256等更安全的哈希函数。
  2. 使用透明数据加密(TDE)

    • 方法介绍
      • TDE是一种在数据库层面提供的加密解决方案。它可以对整个数据库、表空间或者特定的表进行加密。MySQL企业版支持TDE,其原理是在数据写入磁盘时自动进行加密,在从磁盘读取数据时自动解密。这样可以在不改变应用程序对数据库访问方式的情况下,提供数据的安全性。TDE通常使用数据库服务器的密钥管理基础设施(KMI)来管理加密密钥。
    • 示例(以MySQL企业版为例)
      • 首先,需要在服务器上配置密钥管理,这通常涉及到安装和配置专门的密钥管理软件或者使用硬件安全模块(HSM)。
      • 假设要对一个数据库进行加密,在MySQL配置文件(my.cnfmy.ini)中添加如下配置:
        [mysqld]
        early-plugin - load = keyring_file.so
        keyring_file_data = /path/to/keyring/file
        
      • 重启MySQL服务后,使用CREATE TABLESPACE命令创建加密的表空间,例如:
        CREATE TABLESPACE encrypted_tablespace
        ADD DATAFILE 'encrypted_file.ibd'
        ENCRYPTION = 'Y'
        KEY_BLOCK_SIZE = 16;
        
      • 然后,可以在这个加密的表空间中创建表来存储加密后的数据。这样,存储在这个表空间中的数据在磁盘上就是加密的状态。
  3. 应用层加密

    • 方法介绍
      • 在应用程序层面进行加密,可以提供更灵活的加密方式。例如,使用编程语言(如Python、Java等)中的加密库对敏感数据进行加密后再存储到MySQL数据库中。这种方式可以更好地控制加密密钥的管理和加密算法的选择,同时也可以根据业务逻辑的需要进行更复杂的加密操作。
    • 示例(以Python为例)
      • 假设使用cryptography库对数据进行加密,首先需要安装cryptography库(pip install cryptography)。
      • 示例代码如下:
        from cryptography.fernet import Fernet
        import mysql.connector# 生成密钥
        key = Fernet.generate_key()
        cipher_suite = Fernet(key)# 要加密的敏感数据
        sensitive_data = "Confidential Data".encode('utf - 8')
        encrypted_data = cipher_suite.encrypt(sensitive_data)# 连接到MySQL数据库
        mydb = mysql.connector.connect(host="localhost",user="your_user",password="your_password",database="your_database"
        )
        mycursor = mydb.cursor()# 创建表来存储加密数据
        mycursor.execute("CREATE TABLE if not exists encrypted_data (id INT AUTO_INCREMENT PRIMARY KEY, encrypted_text BLOB)")
        # 插入加密后的数据
        mycursor.execute("INSERT INTO encrypted_data (encrypted_text) VALUES (%s)", (encrypted_data,))
        mydb.commit()# 读取加密数据并解密
        mycursor.execute("SELECT encrypted_text FROM encrypted_data")
        result = mycursor.fetchone()
        decrypted_data = cipher_suite.decrypt(result[0]).decode('utf - 8')
        print(decrypted_data)
        
      • 在这个示例中,使用cryptography库中的Fernet类生成密钥并对数据进行加密。加密后的数据存储到MySQL数据库的表中,在读取数据时再进行解密。这种方式可以根据具体的应用场景灵活地处理加密和解密过程,并且可以结合其他安全措施,如密钥的安全存储和管理等。

欢迎关注公众号《小周的数据库进阶之路》,更多精彩知识和干货尽在其中。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/65499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现

本篇教程将带你实现一个简易购物车功能。通过使用接口定义商品结构,我们将创建一个动态购物车,支持商品的添加、移除以及实时总价计算。 关键词 UI互动应用接口定义购物车功能动态计算商品管理列表操作 一、功能说明 简易购物车功能包含以下交互&#…

json的作用?

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有简洁、易读、易于解析和生成等特点,在前后端数据交互、配置文件、数据存储等多个领域发挥着重要作用,以下是具体介绍: JSON 的作用 数据…

PlantUML 入门使用指南

PlantUML 入门使用指南 一、PlantUML介绍二、PlantUML的用途三、PlantUML的语法及示例3.1 用例图(Use Case Diagram)3.2 类图(Class Diagram)3.3 对象图(Object Diagram)3.4 序列图(Sequence Di…

springboot maven 构建 建议使用 --release 21 而不是 -source 21 -target 21,因为它会自动设置系统模块的位置

使用 --release 选项代替 -source 和 -target 是一种更安全、更兼容的方式,特别是在构建使用较新版本 JDK 的项目时。以下是详细解释和建议: 1. 为什么推荐使用 --release 问题点: 使用 -source 和 -target 标志时,仅设置了代码的语言级别和字节码目标版本,但编译器仍可…

快速下载pytorch_geometric

注意:千万不要一上去就使用pip去安装!!! 1.找到GitHub手动下载所需依赖: https://github.com/pyg-team/pytorch_geometric 进入网址后点击此处: 2.点击here进去后寻找自己的torch版本(我的是torch2.1.2的…

微服务-1 认识微服务

目录​​​​​​​ 1 认识微服务 1.1 单体架构 1.2 微服务 1.3 SpringCloud 2 服务拆分原则 2.1 什么时候拆 2.2 怎么拆 2.3 服务调用 3. 服务注册与发现 3.1 注册中心原理 3.2 Nacos注册中心 3.3 服务注册 3.3.1 添加依赖 3.3.2 配置Nacos 3.3.3 启动服务实例 …

GNN图神经网络模型详解与代码复现

图结构数据 图结构数据是一种 非线性数据结构 ,由顶点和边组成,能够灵活表达复杂的关系网络。常见的图结构包括: 类型 特点 无向图 边没有方向 有向图 边有明确的方向 加权图 边附加权重信息 层次图 节点间存在层次关系 这种高度灵活的数据组织方式使得图结构特别适合模拟各…

QT-【常用容器类】-QList类 QLinkedList类

QList 和 QLinkedList 是 Qt 框架中提供的两个重要容器类,用于存储和管理一组数据。它们各自具有不同的特点和优缺点,适用于不同的场景。 1. QList 类概述 QList 是一个动态数组类,提供了对元素的快速随机访问。它的实现类似于 C 标准库中的…

SQLAlchemy示例(连接数据库插入表数据)

背景需求 连接数据库,插入表中一些数据。 其用户是新建用户,所以只能插入,不能更新。 再次输入数据则使用更新数据语法,这个没调试。 #! /usr/bin/env python # -*- coding: utf-8 -*-from sqlalchemy import create_engine, …

低代码开发中 DDD 领域驱动的页面权限控制

在低代码开发的领域中,应用安全与灵活性是两大关键考量因素。领域驱动设计(DDD)作为一种在软件设计领域广泛应用且颇具影响力的方法论,正逐渐在低代码开发的页面权限控制方面展现出其独特的价值与潜力。本文旨在客观地探讨如何借助…

找到一个linux静态库动态库的好资料.3

# 正文 继续整理从这个页面学到的东西:https://tldp.org/HOWTO/Program-Library-HOWTO。 之前的在这里:找到一个linux静态库动态库的好资料.0找到一个linux静态库动态库的好资料.1找到一个linux静态库动态库的好资料.2 这一篇继续看这个: https://tldp…

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之6

本文提要 一些补充 在为前端和后端 锁定的两个中心词“概念”(命题“作文”的 程序 公共逻辑语言 )和“描述”(谓词“描述” 的 自然 描述语言)的基础上 ,暂时将中端的中心词 锁定在“环境” (情境 “意义…

uniapp小程序实现弹幕不重叠

uniapp小程序实现弹幕不重叠 1、在父组件中引入弹幕组件 <template><!-- 弹幕 --><barrage ref"barrage" class"barrage-content" reloadDanmu"reloadDanmu"></barrage> </template> <script>import barr…

区块链平台安全属性解释

区块链平台安全属性解释 双向认证 解释:双向认证是指在通信过程中,**通信双方都需要对对方的身份进行验证,确保对方是合法的、可信任的实体。**只有双方身份都得到确认后,通信才会被允许进行,从而防止非法用户的接入和数据的窃取或篡改。举例:在基于区块链和联邦学习的数…

nginx 基于 geoip 模块限制地区访问

1、安装 geoip 库 [rootVM-0-15-centos ~]# yum -y install geoip geoip-devel 2、下载并安装 MaxMind 的免费 GeoIP 数据库。这里我选择下载 GeoLite2 数据库&#xff0c;适用于大多数应用。 访问 maxmind 官网&#xff08;https://www.maxmind.com/&#xff09;&#xff0c…

openfeign-一些配置

之前整理过一篇 openfeign的快速使用。openfeign简化服务间调用-笔记-CSDN博客 今天补充一下一些个性化配置。 一 日志&#xff1a; 默认的openfeign不输出日志&#xff0c;想看日志需要单独配置下。 日志级别 public static enum Level {NONE,BASIC,HEADERS,FULL;private…

【回溯】LeetCode经典题目总结:组合、排列、子集、分割、N皇后、单词搜索

回溯 组合问题组合总和全排列子集分割回文串N皇后电话号码的字母组合单词搜索括号生成 组合问题 给定两个整数 n 和 k&#xff0c;返回 1 … n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 树形结构&#xff1…

HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?

在 iPhone 拍摄照片时&#xff0c;默认的图片格式为 HEIC。虽然 HEIC 格式具有高压缩比、高画质等优点&#xff0c;但在某些设备或软件上可能存在兼容性问题。因此&#xff0c;将 HEIC 格式转换为更为通用的 JPG 格式就显得很有必要。本教程将介绍如何使用简鹿格式工厂&#xf…

【实战示例】面向对象的需求建模

前言 博主准备写一个以面向对象为核心思想的软件需求建模、领域建模的系列&#xff0c;总结一整套可落地的DDD的打法&#xff0c;前面几篇文章论述了如何进行面向对象的需求建模&#xff0c;本文将以一个简单的购物商城的需求来演示如何进行面向对象的需求建模。 面向对象的需…

04-微服务02

我们将黑马商城拆分为5个微服务&#xff1a; 用户服务 商品服务 购物车服务 交易服务 支付服务 由于每个微服务都有不同的地址或端口&#xff0c;相信大家在与前端联调的时候发现了一些问题&#xff1a; 请求不同数据时要访问不同的入口&#xff0c;需要维护多个入口地址…