首页 > 问答 > 关键词  > MySQL最新资讯  > 正文

MySQL敏感数据怎么加密 数据加密解密教程

2020-07-06 13:58 · 稿源:数据库干货铺
文章目录

大数据时代的到来,数据成为企业最重要的资产之一,数据加密的也是保护数据资产的重要手段。本文主要在结合学习通过MySQL函数及Python加密方法来演示数据加密的一些简单方式。

1. 准备工作

为了便于后面对比,将各种方式的数据集存放在不同的表中。

创建原始明文数据表

/*创建原始数据表*/
CREATETABLE`f_user`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`name`varchar(50)DEFAULTNULL,
`tel`varchar(20)DEFAULTNULL,
`pwd`varchar(50)DEFAULTNULL,PRIMARYKEY(`id`)
);/*新增原始数据*/INSERTINTO`f_user`VALUES(1,'曹操','10000000000','Cc@123'),(2,'关羽','21000000000','Guanyu@21'),(3,'刘备','20000000000','LB#200000');

创建MySQL加密表

CREATETABLE`f_user_m`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`name`varchar(200)DEFAULTNULL,
`tel`varchar(100)DEFAULTNULL,
`pwd`varbinary(255)DEFAULTNULL,PRIMARYKEY(`id`)
);

创建python加密表

CREATETABLE`f_user_p`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`name`varchar(200)DEFAULTNULL,
`tel`varchar(100)DEFAULTNULL,
`pwd`varchar(500)DEFAULTNULL,PRIMARYKEY(`id`)
);

2. MySQL加密函数的方式

2.1 MySQL加密

将明文表中的数据插入到f_user_m中,同时对pwd密码字段进行加密存储,注意要记住加密的字符串,因为解密的时候要用到这个值。

/*加密密码字段*/mysql>insertintof_user_m(name,tel,pwd)
selectname,tel,AES_ENCRYPT(pwd,'MySQL')fromf_user;
QueryOK,3rowsaffected(0.00sec)
Records:3Duplicates:0Warnings:0

存储的结果如下

注:

加密后的数据直接存储varchar类型的字段中会出现如下报错:

ERROR1366(HY000):Incorrectstringvalue:'\xF0K+!\x15?...'forcolumn'pwd'atrow1

可以用如下三种方式处理:

1) 加密后的数据在utf8 字符集下必须存放在varbinary/binary/blob等二进制字段属性的字段中,故上文中密码字段的类型设置为varbinary类型

2) 可以对加密后的数据使用HEX()函数来 16 进制化存入,取出时先用UNHEX()处理再解密

3) 采用latin1字符集直接存储在varchar类型字段中,但是不推荐

三种方式可以自行测试处理。

2.2 MYSQL解密

对于加密后的数据可以使用MySQL的解密函数AES_DECRYPT进行解密查看明文

mysql>selectname,tel,AES_DECRYPT(pwd,'MySQL')pwdfromf_user_m;
+--------+-------------+-----------+|name|tel|pwd|+--------+-------------+-----------+|曹操|10000000000|Cc@123||关羽|21000000000|Guanyu@21||刘备|20000000000|LB#200000|+--------+-------------+-----------+3rowsinset(0.00sec)

此时查看的数据和明文表里的一致了。

3. Python base64 加密方法

3.1 使用Python的encodestring方法加密

编写python脚本,将数据加密后插入表中

#!/usr/bin/python#coding=utf-8importpymysqlasmdbimportbase64
sor_conn=mdb.connect(host='127.0.0.1',port=3306,user='root',passwd='Root@Py123')
sor_cur=sor_conn.cursor()
v_sql="selectname,tel,pwdfrombak_db.f_user"result_tb=sor_cur.execute(v_sql)
t=sor_cur.fetchall()forcolint:
v_name=col[0]
v_tel=col[1]
v_pwd=col[2]
v_pwd=base64.encodestring(v_pwd)#加密
v_sql_insert="insertintobak_db.f_user_p(name,tel,pwd)values('%s','%s','%s');"%(v_name,v_tel,v_pwd)
sor_cur.execute(v_sql_insert)
sor_conn.commit()
sor_conn.close()

查询加密后的数据如下:

/*加密后的数据如下*/mysql>select*fromf_user_p;+----+--------+-------------+---------------+|id|name|tel|pwd|+----+--------+-------------+---------------+|1|曹操|10000000000|Q2NAMTIz||2|关羽|21000000000|R3Vhbnl1QDIx||3|刘备|20000000000|TEIjMjAwMDAw|+----+--------+-------------+---------------+3rowsinset(0.00sec)

3.2 使用Python的decodestring方法解密

解密的方式采用base64.decodestring方法进行,该方法比较简单,可以自行测试.

注: 此方法的加、解密没有加密串进行加成,安全性相对较低,因此可以继续采用另一种方式进行。

4. Python AES算法加密

AES算法需用到Crypto.Cipher模块,此方法类似于MySQL的方式,可以自定义加密串,解密时也许用到对应的加密串,安全性相对较高。

使用前需先安装Crypto

pipinstallCrypto

测试程序如下:

#!/usr/bin/python#coding=utf-8fromCrypto.CipherimportAESimportpymysqlasmdbfrombinasciiimportb2a_hex,a2b_heximportsyssor_conn=mdb.connect(host='127.0.0.1',port=3306,user='root',passwd='Root@Py123')
sor_cur=sor_conn.cursor()classPyDbString():def__init__(self):
self.key='pythonkey2020320'
self.mode=AES.MODE_CBCdefaddString(self,text):
cryptor=AES.new(self.key,self.mode,self.key)
length=32
count=len(text)
add=length-(count%length)
text=text+('\0'*add)
self.ciphertext=cryptor.encrypt(text)returnb2a_hex(self.ciphertext)defdesString(self,text):
cryptor=AES.new(self.key,self.mode,self.key)
plain_text=cryptor.decrypt(a2b_hex(text))returnplain_text.rstrip('\0')
v_strpass=PyDbString()
v_sql="selectname,tel,pwdfrombak_db.f_user"result_tb=sor_cur.execute(v_sql)
t=sor_cur.fetchall()forcolint:
v_name=col[0]
v_tel=col[1]
v_pwd=col[2]print(v_pwd)
v_pwd=v_strpass.addString(v_pwd)#加密
v_sql_insert="insertintobak_db.f_user_p(name,tel,pwd)values('%s','%s','%s');"%(v_name,v_tel,v_pwd)
sor_cur.execute(v_sql_insert)
sor_conn.commit()
sor_conn.close()

查看数据如下:

解密的方法可以将上例中的addstring 改为desString即可。

上面通过三种方式进行数据的加密、解密,个人推荐第三种方式,从应用层自定义加密。另外,此方法只是加密,实际应用中可能要用加密、混淆等脱敏方法来保障数据安全,另外,很多情况下没有解密方式,即不可逆,有兴趣的可以多多沟通,感谢!

  • 相关推荐
  • 大家在看
  • 上寺库选购Jimmy Choo短靴 冬季穿搭就靠它了

    短靴,可谓是秋冬穿搭的必备单品,这是一款怎么搭都好看,什么服饰都能搭的百搭鞋履。一款好看又好穿的短靴不是那么容易可以买到,不过在寺库,你可以选购到几乎零差评的Jimmy Choo短靴!寺库是亚洲领先的线上线下精品生活方式平台,上面汇聚了大量来自世界各地的奢侈品品牌,其中就包括Jimmy Choo的鞋履!Jimmy Choo是以设计师Jimmy Choo的名字命名的品牌,品牌于 1996 年成立,除了鞋子,Jimmy Choo还经营包袋、香水等产品,不过

  • 苹果Find My服务今天凌晨出现短暂故障 现已修复

    由于 Find My 服务的故障,部分 iPhone 用户无法使用硬件定位服务,不过苹果很快解决了这个问题。苹果公司的系统状态网页的更新告知 Find My 服务故障已经修复,故障时间为今天凌晨 3 点 30 分至 5 点 15 分。部分用户受到影响,无法使用这项服务。苹果公司通常不提供系统问题纠正的估计时间,但似乎苹果公司处理该问题的时间总共不到两小时。苹果公司通过 Twitter 确认,它“知道并正在修复查找我的问题”,并建议“密切关注”状?

  • Myeong香港宫廷荟,带你解锁宫廷中药新护肤方式!

    如果说中医药是中国古代历史长河遗留下的瑰宝,那么宫廷中医护肤作为传统护肤发展的顶峰,可以说是令世界都瞩目的中华国粹。近几年宫廷护肤深受消费者追捧,但目前市场护肤品牌质量参差不齐,消费者难免眼花缭乱,难以抉择。推荐来自中国香港的Myeong香港宫廷荟,汇集中国千年历史的嫩肌古方,还原各朝代最精湛的护肤智慧,结合现代天然的炼制技术,深受中高端女性消费者的喜欢。 Myeong香港宫廷荟汇集香港专业的中医药团队,炼制?

  • 金彭新能源“放价啦”,金彭艾咪AMY价格让消费者大呼惊喜

    举国欢庆的国庆长假已经结束,但金彭新能源的“放价”却持续进行着。自 7 月初推出新品金彭艾咪AMY, 2 万左右亲民的指导售价,让其销量持续处于市场前列。除了极具吸引力的优惠价格外,这款车还有哪些吸引消费者的地方?它与金彭新能源之前的车款相比,做了哪些升级?下面我们就一起来探寻答案。设计能给消费者带来新鲜感虽然规格上是微型电动车(长2900/宽1400/高1500),但和市场上流行的小而圆的微型车设计风格不同,前脸采用?

  • 美参议员Amy Klobuchar:对大科技的监管即将到来

    据外媒报道,美民主党参议员Amy Klobuchar于当地时间周二表示,她和共和党参议员Charles Grassley于本周早些时候提出的禁止互联网公司偏袒自己产品的两党立法应该向亚马逊、Google和Facebook等公司发出一个强烈的信号,即监管即将到来以控制它们的权力。担任参议院司法委员会反垄断小组委员会主席的明尼苏达州民主党人Amy Klobuchar和参议院司法委员会的最高共和党人爱荷华州的Grassley周一提出了《美国创新和在线选择法案(The Ame

  • 部分iPhone13用户反应新MagSafe Wallet无法连接到Find My

    据外媒macrumors报道,在推出新iPhone 13机型的同时,苹果还推出了内置Find My的MagSafe Wallet的更新版本。新MagSafe Wallet的设计是为了在它从iPhone上滑落或从口袋里掉出来时更容易找到,但一些新MagSafe Wallet的用户却无法连接Find My。根据Reddit上的信息,受影响的用户在将MagSafe Wallet连接到iPhone上时无法获得适当的Find My弹出窗口。这个问题似乎特别影响到了iPhone 13机型,不过也有一些来自iPhone 12用户的投诉。正?

  • Canonical宣布启动Ubuntu 22.01“Jammy Jellyfish”LTS开发项目

    随着 Canonical 今日正式开放了“Jammy”存档,意味着 Ubuntu 22.04“Jammy Jellyfish”长期支持版本(LTS)的开发项目也被正式摆上了议事日程。如果一切顺利,新 LTS 版本将于 2021 年 4 月 21 日到来。目前“Jammy”存档已经向开发者开放,且与 Debian 保持自动同步。截图(来自:Canonical)与 Ubuntu 22.04 一同到来的,包括 Python 3.10 和 OpenSSL 3.0 。而在未来半年内,LTS 版本还计划引入 PHP 8.1、Ruby 3.0、GNOME 42.0?

  • 三星Galaxy S22 Ultra-dummy单元出现在实拍中

    我们已经看到了三星即将推出的Galaxy S22系列的渲染,其中S22 Ultra系列呈现了一个有趣的背面设计,并有传闻说是s笔槽。现在,xleaks7和CoverPigtou联手让我们第一次看到了银河系S22 Ultra的一个虚拟单元,这是在现场照片。三星Galaxy S22超虚拟单元(图片:xleaks7 x CoverPigtou)该设备的整体形状与去年的Galaxy Note20 Ultra非常相似,这进一步强调了最近的传言,即它可能最终成为Note22 Ultra。基于OnLeaks的渲染,S22 Ultra/

  • 苹果AI主管Samy Bengio确认将出席Nvidia年度GTC会议

    在 11 月举行的 Nvidia 年度 GTC 会议上,苹果公司人工智能和机器学习研究高级主管萨米·本吉奥(Samy Bengio)将上台发言。NVIDIA 本周三宣布了参与本次会议的顶级发言人,除了 Bengio 之外还有来自 PayPal, Snap, Amazon, Facebook, Google 和 Epic Games 的高管们。NVIDIA 年度 GTC 会议将于 2021 年 11 月 8 日至 11 日举行,在活动中写道:“发言人分享最新的突破,这些突破正在改变世界上一些最大的行业,如医疗保健、运输、制

  • AirPods Pro 2渲染图曝光:耳机设计不变 充电盒底部配扬声器孔用于Find My

    在 AirPods 3 发布之后,苹果可能正在开发 AirPods Pro 2,并有望在明年年初上线。此前有消息称 AirPods Pro 2 可能会采用无柄设计,不过最新曝光的渲染图和这个说法存在冲突,依然会采用和初代相似的设计。这张疑似 AirPods Pro 2 的谍照来自于“Xerxes”,不过该来源此前并没有什么精准爆料,因此可靠性仍存在问号。不过该来源表示这个新渲染图来自于“苹果内部”。从渲染图来看,AirPods Pro 2 的外观设计似乎和初代 AirPods 相

这篇文章对你有价值吗?

  • 热门标签
京东双11红包