前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用MySQL Keyring 的 SECRET类型密钥执行非对称加密

使用MySQL Keyring 的 SECRET类型密钥执行非对称加密

作者头像
MySQLSE
发布于 2020-09-28 07:40:55
发布于 2020-09-28 07:40:55
2K00
代码可运行
举报
运行总次数:0
代码可运行

作者:Mike Frank 译:徐轶韬

仅用于通过应用程序使用解密/加密

以下是一个示例,演示应用程序使用公钥进行非对称加密数据。在MySQL 8.0.19中,添加了支持Keyring技术的SECRET密钥类型。使用此技术,用户可以使用以下方法安全地管理自己的密钥:

Oasis KMIP协议实现:

  • Oracle Key Vault
  • Gemalto KeySecure
  • Thales Vormetric Key Management Server
  • Fornetix Key Orchestration
  • New! Townsend Alliance Key Manager

其他用于密钥管理的API

  • 使用自己的密钥– 加密密钥文件
  • Hashicorp Vault
  • 更多

先决条件

MySQL企业版8.0.19或更高版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select @@version;

演示开始

以管理员身份(以admin身份运行示例– root@localhost) 安装MySQL Keyring

检查一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';

下一步,安装MySQL Keyring UDF

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSTALL PLUGIN keyring_udf SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_generate RETURNS INTEGER
SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_fetch RETURNS STRING
SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_length_fetch RETURNS INTEGER
SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_type_fetch RETURNS STRING
SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_store RETURNS INTEGER
SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_remove RETURNS INTEGER
SONAME 'keyring_udf.so';

安装MySQL企业版加密

代码语言:javascript
代码运行次数:0
运行
复制

现在可以创建一个示例–在这种情况下,我们要

  1. 通过推入keyring 来保护私钥
    • 如果您丢失了私钥–您将丢失所有加密数据。
    • 如果密钥被盗–小偷可以读取您的敏感数据。
  2. 客户端应用程序的MySQL用户只能使用公钥加密敏感数据
  3. 另一个用户可以使用私钥解密该数据

创建用于存储敏感“秘密”数据的表

已经准备好了,让我们看一下这个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `secretdb`.`secrets_table`
(`secid` INT NOT NULL, 
`secrets_tablecol` VARBINARY(3000) NOT NULL);

创建私有PEM key并将其存储在MySQL keyring

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT keyring_key_store
('MySecret', 'SECRET',
create_asymmetric_priv_key('RSA', 2048));

查看一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select keyring_key_fetch('MySecret');

创建一个函数,允许应用程序用户获取公钥并加密“秘密”。

在这种情况下,用户无法运行keyring_key_fetch(他们没有权限),因此,该函数将SQL SECURITY作为DEFINER(在本例中为root)运行。此函数将仅返回公钥(从keyring的私钥中提取出来)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE DEFINER = 'root'@'localhost' 
FUNCTION `secretdb`.`secdb_public_key`() 
RETURNS TEXT(500) deterministic
SQL SECURITY DEFINER
RETURN 
RTRIM(CREATE_ASYMMETRIC_PUB_KEY('RSA',keyring_key_fetch('MySecret')));

尝试一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select `secretdb`.`secdb_public_key`();

创建应用程序的MySQL用户,并对表和函数进行访问授权。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE USER 'appuser'@'%' IDENTIFIED BY <password>;
GRANT USAGE ON *.* TO `appuser`@`%`;

现在–试试看–以该用户身份登录

获取公钥

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select `secretdb`.`secdb_public_key`() into @pubk; GRANT SELECT, INSERT ON `secretdb`.* TO `appuser`@`%`'; GRANT EXECUTE ON FUNCTION `secretdb`.`secdb_public_key` TO 'appuser`@'%';

接下来,让我们创建一个“秘密”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SET @secretphrase='Sooo very secret 1';

定义密钥长度和算法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SET @key_len = 2048; SET @algo = 'RSA';

加密数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SET @enc_value = ASYMMETRIC_ENCRYPT(@algo, @secretphrase, @pubk);

查看其加密

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 'Encrypted secret ', @enc_value;

插入表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO `secretdb`.`secrets_table` (`secid`, `secrets_tablecol`) VALUES (1, @enc_value);

再做另外一个秘密

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SET @secretphrase='Sooo very secret 2'; select @secretphrase; Set @enc_value = ASYMMETRIC_ENCRYPT(@algo, @secretphrase, @pubk); select 'Encrypted secret 2', @enc_value;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO `secretdb`.`secrets_table` (`secid`,`secrets_tablecol`) VALUES (2, @enc_value);

查看加密的数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from `secretdb`.`secrets_table`;

注意:没有私钥,appuser无法解密。

以root身份登录并解密数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select `secrets_table`.`secrets_tablecol` into @encrsecretphrase from `secretdb`.`secrets_table` where secid=2;
select @encrsecretphrase;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select keyring_key_fetch('MySecret') into @privappprivpkey; select @privappprivpkey; Set @enc_pp = ASYMMETRIC_DECRYPT(@algo, @encrsecretphrase, @privappprivpkey); select 'Secret', @enc_pp;

作为root用户,可以看到数据。

现在,我们要提供除root用户以外的其他用户对私钥的访问权限。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE DEFINER = 'root'@'localhost' FUNCTION `secretdb`.`secdb_private_key`() RETURNS TEXT(500) deterministic SQL SECURITY DEFINER RETURN rtrim(keyring_key_fetch('MySecret'));

以root身份测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select `secretdb`.`secdb_private_key`();

让我们创建另一个用户-该用户也有权访问数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE USER 'privuser'@'%' IDENTIFIED BY <password>;
GRANT USAGE ON *.* TO 'privuser'@'%'; 
GRANT SELECT ON `secretdb`.* TO 'privuser'@'%';
GRANT EXECUTE ON FUNCTION `secretdb`.`secdb_private_key` TO 'privuser'@'%';

测试访问

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select `secretdb`.`secdb_private_key`();

检索数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SET @algo = 'RSA'; select `secrets_table`.`secrets_tablecol` into @encrsecretphrase from `secretdb`.`secrets_table` where secid=2;

看-它已经加密

select @encrsecretphrase;

让我们解密

获取私钥

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select secretdb.secdb_private_key() into @privappprivpkey;

用私钥解密数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Set @enc_pp = ASYMMETRIC_DECRYPT(@algo, @encrsecretphrase, @privappprivpkey);

查看“秘密”

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 'The secret is', @enc_pp;

演示结束。

常见问题

如果我想加密/解密应用程序中的数据怎么办?

您可以使用带有公共或私有密钥(PEM格式)的openssl或兼容库来实现。只要确保您以二进制形式插入/更新数据即可。

如果我的数据大于非对称加密可以处理的数据怎么办?

进行混合加密,您可以获得与公钥相同的好处。

由于现在支持SECRET,因此无需将密钥存储在安全性较低的表中-现在您可以将它们作为SECRET类型放置在更安全的keyring上。

展望未来

试试看,不会花很长时间。通过keyring,非对称加密,对称加密,权限和其他访问控制,解决数据安全性的方法还有多种多样的选择。

例如,用户只能将公钥存储在主服务器上,将私钥存储在只读从服务器上。私钥只能存在于应用程序中,不能存在于mysql keyring上。或者,可以编写一个具有用户权限的函数,该函数可以在拥有权限时解密,但根本不显示私钥。

如果您遇到安全挑战,请告诉我们。

与往常一样,感谢您使用MySQL。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MySQL解决方案工程师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
对称加密与非对称加密
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。
用户7353950
2022/05/10
1K0
对称加密与非对称加密
MySQL 8.0.30 的数据加密有哪些变化?
MySQL 8.0.30于2022年7月26日正式发行。在这个版本里,除了为数据加密功能增加了KDF(Key Derivation Function),还为企业版发布了新的加密组件,以替代之前基于OpenSSL的UDF。
MySQLSE
2022/11/21
2K0
MySQL安全相关-- TDE和数据脱敏功能介绍
TDE( Transparent Data Encryption,透明数据加密) 指的是无需修改应用就可以实现数据的加解密,在数据写磁盘的时候加密,读的时候自动解密。加密后其他人即使能够访问数据库文件,没有key也无法读取数据,从而达到防止非法访问的目的。
MySQLSE
2022/03/14
1.7K0
PHP的OpenSSL加密扩展学习(二):非对称加密
上篇文章,我们了解了关于对称和非对称加密的一些相关的理论知识,也学习了使用 OpenSSL 来进行对称加密的操作。今天,我们就更进一步,学习 OpenSSL 中的非对称加密是如何实现的。
硬核项目经理
2020/11/10
8980
对称加密与非对称加密
优点:速度快,对称性加密通常在消息发送方需要加密大量数据时使用,算法公开、计算量小、加密速度快、加密效率高。
lyb-geek
2022/03/09
2.5K0
对称加密、非对称加密、RSA、消息摘要、数字签名、数字证书与HTTPS简介
对称加密算法使用的加密和解密的密钥一样,比如用秘钥123加密就需要用123解密。实际中秘钥都是普通数据在互联网传输的,这样秘钥可能会被中间人截取,导致加密被破解。其过程如下:
恋喵大鲤鱼
2019/03/11
12.3K3
对称加密、非对称加密、RSA、消息摘要、数字签名、数字证书与HTTPS简介
对称加密和非对称加密
对称密钥是双方使用相同的密钥 。 对称加密的要求   (1)需要强大的加密算法。算法至少应该满足:即使分析人员知道了算法并能访问一些或者更多的密文,也不能译出密文或得出密匙。通常,这个要求以更强硬的形式表达出来,那就是:即使分析人员拥有一些密文和生成密文的明文,也不能译出密文或者发现密匙。即,加密算法应足以抵抗已知明文类型的破译。   (2)发送方和接收方必须用安全的方式来获得保密密匙的副本,必须保证密匙的安全。如果有人发现了密匙,并知道了算法,则使用此密匙的所有通信便都是可读取的。 从数学角度理解   以一个具体例子来说明有助于真正理解对称加密这概念。假设A需要把一份明文为M的资料发给B,但是因为怕资料在传输的中途被窃听或者篡改,A用了对称加密法将M经过一个加密函数Fk处理后生成M'加密文,而B接受到加密文后通过事先商定好的Fk再次处理M'便可以还原成明文M,从而达到安全传输信息的目的。
用户2909867
2018/08/22
1.3K0
非对称加密
加密模式只有一种实现,即RSACryptoServiceProvider,采用的是RSA算法。DSACryptoServiceProvider只能进行认证模式,即数字签名,不能进行加密模式。
小蜜蜂
2019/07/24
8780
非对称加密
对称加密与非对称加密
对称加密算法中对于数据的加密与解密使用同一密钥,即使用相同的密码对内容进行加密解密。
WindRunnerMax
2020/08/27
1.5K0
PHP 使用非对称加密算法(RSA)
  以前一直对客户端传给服务器的信息加密这一块一脸懵,如果app里面的用户登录信息被抓包拿到了,大写着 username:root,password:123456,  那不是很尴尬。
Lansonli
2021/10/09
1.9K0
java实现非对称加密
对称加密:加密和解密的过程使用的是相同的密钥 非对称加密 与对称加密不同,非对称加密算法的加密和解密使用不同的两个密钥.这两个密钥就是我们经常听到的”公开密钥”(公钥)和”私有密钥”(私钥). 公钥和
秋白
2018/05/24
2.2K0
三、对称加密、非对称加密、混合加密
  两边用同一个密钥来加解密。 A把明文通过某一算法加密之后得到密文,然后把密文发送给B,B接收到密文之后用相同的密钥执行相同的算法去解密。X没有密钥,即使窃取到密文也无法窃听。
砖业洋__
2023/05/06
1.7K0
三、对称加密、非对称加密、混合加密
为什么非对称加密比对称加密慢?
这个问题是一个读者面试时遇到的一个问题,准备过面试的人应该都记得,非对称加密与对称加密的区别之一就是非对称加密的速度慢,但是我们做业务开发的时候通常都是直接调用算法,对其原因并没有过多深究,因此如果有面试官问到了这个问题,的确会让人措手不及。正好借着这篇文章来说一说。
出其东门
2020/07/31
4.3K0
为什么非对称加密比对称加密慢?
国密算法,明文、密文、密码、密钥、对称加密、非对称加密简单理解
国密算法是什么? 国密算法是由国家密码局发布,包含SM1、SM2、 SM3、 SM4、 SSF33算法。 国际算法是什么? 国际算法由美国的安全局发布,是现今最通用的商用算法。 密码学中应用最为广泛算法都有哪些? 密码学中应用最为广泛的的三类算法: 1、对称算法(分组密码算法)代表分组密码算法(DES和SM4); 2、非对称算法(公钥密码算法)代表公钥密码算法(RSA和SM2); 3、杂凑算法(摘要算法)代表摘要算法(HAS-256系列和SM3);
zhangjiqun
2024/12/16
2600
国密算法,明文、密文、密码、密钥、对称加密、非对称加密简单理解
JAVA使用几种非对称加密
DH: package com.fengyunhe.asymmetric; import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin; import javax.crypto.*; import javax.crypto.interfaces.DHPublicKey; import javax.crypto.spec.DHParameterSpec; import java.security.*; import java.security
前Thoughtworks-杨焱
2021/12/08
4540
PHP加密解密方法及常见问题解决方案(php对称加密和非对称加密示例)
php是一种流行的服务器端编程语言,广泛用于web应用程序开发中。在实际应用中,php加密解密是非常常见的操作。本文将介绍php中常见的加密解密方法,以及常见问题的解决方案。
超级小可爱
2024/02/24
9210
非对称加密与OpenSSL
随着个人隐私越来越受重视, HTTPS也渐渐的流行起来, 甚至有许多网站都做到了全站HTTPS, 然而这种加密和信任机制也不断遭遇挑战,比如戴尔根证书携带私钥,Xboxlive证书私钥泻露, 还有前一段时间的沃通错误颁发Github根域名SSL证书事件. 因此本文从非对称加密说起, 介绍了证书的签证流程, 并且通过openssl的命令行工具对这些过程都转化为相对具体的命令, 也算是一个温故知新的简要记录吧.
evilpan
2023/02/12
9920
非对称加密与OpenSSL
Golang与非对称加密
DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。RSA算法却做不到,但是其缺点就是只能用于数字签名,不能用于加密
仙人技术
2021/12/31
1.2K0
Golang与非对称加密
都2022年了,还不会对称加密和非对称加密算法?
下单做一次支付,若还是使用HTTP协议,可能会被黑客盯上。 你发送个请求,买娃娃,但该网络包被截获,于是在服务器回复你之前,黑客先假装自己就是电商网站,然后给你回复一个假消息:“好呀,来把银行卡号、密码拿来。” 这时你真把银行卡密码发给它,就中招了。
JavaEdge
2022/01/19
4890
哈希算法是对称算法还是非对称算法_对称加密和非对称加密原理
作用:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。 哈希算法的目的:为了验证原始数据是否被篡改。 哈希算法最重要的特点就是: 相同的输入一定得到相同的输出; 不同的输入大概率得到不同的输出。
全栈程序员站长
2022/11/01
1.2K0
推荐阅读
相关推荐
对称加密与非对称加密
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档