数据脱敏和数据加密的区别以及MySQL相关的加密函数示例介绍

一、数据脱敏和数据加密的区别

数据脱敏和数据加密是两种截然不同的技术,适用于不同目的。

脱敏技术主要是为了兼顾数据安全与数据使用,采用的是专业的数据脱敏算法;而加密则是通过对数据进行编码来保护数据,检索原始值的唯一方法是使用解密密钥解码数据。

脱敏数据仍然便于使用,但加密数据不是。

加密的主要优点在于它的可逆性,但是解密密钥存储位置、如何存储以及确定谁具有访问权限等工作都会给整个安全工作增加额外的成本、故障点,加剧复杂性。

数据加密

敏感数据的实际值被转换为“垃圾”值,除非通过解密还原出原始值,否则人类无法理解这些值。

数据脱敏

在一个不可逆转的过程中,敏感数据的真实值被转换成虚构的、但看起来逼真的值,原始值被永久改变且无法恢复。

上面两个简图能够帮助我们清晰地了解加密和脱敏的概念区别,当然实际技术还要复杂得多。比如脱敏根据不同的数据类型可能会应用不同的脱敏规则。

综上,我们总结一下数据加密相较于脱敏的不足之处:

1. 数据加密不能完全从技术上保证数据的安全。严格来说,任何有权访问用户数据的人员,如ETL工程师或是数据分析人员等,均有可能导致数据泄漏(数据脱敏能够更好地保证数据隐私性)。

2. 没有访问用户数据权限的人员,也可能存在对该数据进行分析挖掘的需求,数据的访问约束大大限制了充分挖掘数据价值的范围(数据脱敏能保证数据的可用性)。

3. 解密密钥存储位置、如何存储以及确定谁具有访问权限等工作都会给整个安全项目增加额外的成本、故障点,扩大复杂度。

数据脱敏和数据加密在数据层面的不同表现:

脱敏:在此只是对数据如姓名,身份证号码等进行简单粗暴的脱敏,即改变数据
加密:下面将对于几种加密和其解密算法进行讲述。
 

二、MySQL加密的解密示例介绍:

原始数据如下:

mysql> desc sal_tb;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| sal   | double     | YES  |     | NULL    |       |
| name  | varchar(5) | YES  |     | NULL    |       |
| month | int(11)    | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

mysql> select * from sal_tb;
+------+------+-------+
| sal  | name | month |
+------+------+-------+
|   70 | tom  |    11 |
|   30 | tom  |     9 |
|  111 | tom  |     7 |
|  111 | tom  |     9 |
+------+------+-------+
4 rows in set (0.00 sec)

1. 加密:mysqlsha1,不可逆

mysql> select password(`name`) from sal_tb;
+-------------------------------------------+
| password(`name`)                          |
+-------------------------------------------+
| *71FF744436C7EA1B954F6276121DB5D2BF68FC07 |
| *71FF744436C7EA1B954F6276121DB5D2BF68FC07 |
| *71FF744436C7EA1B954F6276121DB5D2BF68FC07 |
| *71FF744436C7EA1B954F6276121DB5D2BF68FC07 |
+-------------------------------------------+
4 rows in set, 4 warnings (0.01 sec)

2. 加密:md5,不可逆

mysql> select md5(`name`) from sal_tb;
+----------------------------------+
| md5(`name`)                      |
+----------------------------------+
| 34b7da764b21d298ef307d04d8152dc5 |
| 34b7da764b21d298ef307d04d8152dc5 |
| 34b7da764b21d298ef307d04d8152dc5 |
| 34b7da764b21d298ef307d04d8152dc5 |
+----------------------------------+
4 rows in set (0.00 sec)

3. 加密解密:encode()和decode()

都有两个参数,第一个是实际需要保存的值,第二个是盐值。

mysql> select ENCODE(`name`,'salt6666') from sal_tb;
+---------------------------+
| ENCODE(`name`,'salt6666') |
+---------------------------+
|
  �w                        |
|
  �w                        |
|
  �w                        |
|
  �w                        |
+---------------------------+
4 rows in set, 4 warnings (0.00 sec)

mysql> select decode(ENCODE(`name`,'salt6666'),'salt6666') from sal_tb;
+----------------------------------------------+
| decode(ENCODE(`name`,'salt6666'),'salt6666') |
+----------------------------------------------+
| tom                                          |
| tom                                          |
| tom                                          |
| tom                                          |
+----------------------------------------------+
4 rows in set, 8 warnings (0.00 sec)

4. AED加密解密:aes_encrypt()和aes_decrypt()

都有两个参数,第一个是实际需要保存的值,第二个是盐。

mysql> select aes_ENCRYPT(`name`,'6666') from sal_tb;
+----------------------------+
| aes_ENCRYPT(`name`,'6666') |
+----------------------------+
| ;�$z\�\VRh�$�B�                 |
| ;�$z\�\VRh�$�B�                 |
| ;�$z\�\VRh�$�B�                 |
| ;�$z\�\VRh�$�B�                 |
+----------------------------+
4 rows in set (0.00 sec)

mysql> select aes_DECRYPT(aes_ENCRYPT(`name`,'6666'),'6666') from sal_tb;
+------------------------------------------------+
| aes_DECRYPT(aes_ENCRYPT(`name`,'6666'),'6666') |
+------------------------------------------------+
| tom                                            |
| tom                                            |
| tom                                            |
| tom                                            |
+------------------------------------------------+
4 rows in set (0.00 sec)

5. EDS加密解密:des_encrypt()和des_decrypt()

都有两个参数,第一个是实际需要保存的值,第二个是盐。

mysql> select DES_ENCRYPT(`name`,'6666') from sal_tb;
+----------------------------+
| DES_ENCRYPT(`name`,'6666') |
+----------------------------+
| ��x���                       |
| ��x���                       |
| ��x���                       |
| ��x���                       |
+----------------------------+
4 rows in set, 1 warning (0.00 sec)

mysql> select DES_DECRYPT(DES_ENCRYPT(`name`,'6666'),'6666') from sal_tb;
+------------------------------------------------+
| DES_DECRYPT(DES_ENCRYPT(`name`,'6666'),'6666') |
+------------------------------------------------+
| tom                                            |
| tom                                            |
| tom                                            |
| tom                                            |
+------------------------------------------------+
4 rows in set, 2 warnings (0.00 sec)

三、Hive加密的解密示例介绍:

1、用hive的udf自定义函数实现对hive表数据进行RSA加密以及解密 https://blog.csdn.net/Json_zwl/article/details/84563183

2、Hive 实现脱敏以及ETL 过程(开启kerberos)https://blog.csdn.net/u013850277/article/details/77345882

3、hive自定义udf实现md5功能   https://blog.csdn.net/u010454030/article/details/51491446

(1) 继承UDF类,定义evaluate方法

注意,这里用的是maven项目,只需要引入hive-exec包即可: 
xml 
 
org.apache.hive 
hive-exec 
1.2.1 
provided 
 

evaluate方法并不是重写的方法,而是一个新的方法,Pig里面是需要重写exec方法,来完成自定义逻辑的,代码如下: 
““java 
package com.easy.md5; 
import com.google.common.base.Strings; 
import com.google.common.hash.Hashing; 
import org.apache.hadoop.hive.ql.exec.UDF; 
/** 
* Created by qindongliang on 2016/5/23. 
* Hive自定义UDF,计算md5值 
*/ 
public class MD5 extends UDF { 
/** 
* @param s 传入参数 
* @return md5值 
*/ 
public String evaluate(final String s) { 
if(Strings.isNullOrEmpty(s.trim())){ 
return null; 

return Hashing.md5().hashString(s.trim()).toString(); 

}

““

(2)注册Hive的UDF的jar包
程序完成后,打包成jar,然后上传到对应的机器上,开始注册自己的UDF函数,这里有两种方式:

A:临时注册

执行hive命令,进入终端:

sql 
add jar /home/hive/udfs/hive-md5-guava-1.0.0.jar; 
create temporary function md5 as 'com.easy.md5.MD5'; 
select md5('hadoop'); 
--结果: 3abb766da6c2c2d7739f3cb7799a4caa 

B:永久注册(hive0.13之后支持)

在linux上,上传jar包至HDFS中 
shell 
hadoop fs -put hive-md5-guava-1.0.0.jar /user/tez/ 

进入hive终端 
““sql 
CREATE FUNCTION md5 AS ‘com.easy.md5.MD5’ USING JAR ‘hdfs:///user/tez/hive-md5-guava-1.0.0.jar’ ; 
select md5(‘hadoop’); 
–结果: 3abb766da6c2c2d7739f3cb7799a4caa 
–删除临时函数 
DROP TEMPORARY FUNCTION [IF EXISTS] function_name; 
–删除永久函数 
DROP FUNCTION [IF EXISTS] function_name; 
–重新加载函数 hive1.2.0之后支持 
RELOAD FUNCTION;

““ 
这样就不用每次打开终端都需要注册了
 

参考:https://blog.csdn.net/kkx1988/article/details/80050355 

           https://www.cnblogs.com/zj0208/p/7682791.html

           https://www.cnblogs.com/lvdongjie/p/4240986.html

你可能感兴趣的:(mysql,数据库)