【数据加密/脱敏】各种数据库、代码加密/解码的方法

本人菜鸡一只,阅读该文章之前,有句话我得先说一下:

本文不是来介绍加密算法的,也不是来解释加密算法的过程的。如果本意想研究加密算法的实现,或者概念。不好意思本文可能啰哩叭嗦还帮不上忙!

前言:

数据加密,也就是数据脱敏。其实就是将一些涉及不是本人就不该看的字段数据通过某些方法,让别人就算拿到了数据也看不懂或者解析不出关键信息。

当然加密总体上分两种,一种是可还原,一种是不可还原(当然只是相对不可还原,不排除某些加密算法最后被破解并且被证明可逆),可逆算法一般来说是为了数据传输的时候不用明文传输,然后和对方约定好加密方式,让约定好的双方才能够看懂信息,当然战争时期,什么谍战片就会有那种截获敌方发送的报文,然后破译敌方军事机密的桥段,例如电影:《厨子戏子痞子》

正文:

一、不可逆

1.大名鼎鼎的MD5

2.我不太了解的SHA

二、可逆

一般常见的有:(可能是我所知道的吧,但是其实我是个孤陋寡闻的人)

1.hex

2.escape

3.base64

三、使用

我会比较大篇幅的来说明不同地方的使用方式。

1.代码(各种语言)

我想通过代码实现是最繁琐的方式了,不同语言肯定会提供不同的库或者包,通过引用这些包就可以将字符串加密

比如MD5的java实现

(作者:zhaojiaxing0216)https://blog.csdn.net/zjx2016/article/details/75069169/

不同语言的加密算法真是一搜一大把,我就不再做这种重复的工作了

2.sql

有时候我们也不会在数据库中存储明文的数据,万一被别人“脱裤”了,那不就凉凉了,所以有些关键字段也会做加密,当然要么在代码层面加密之后存到数据库中,或者如果数据库有函数可以直接加密解密那是最方便的了

以greenplum/postgresql为例:

--在pg中提供了DECODE和ENCODE这两个兄弟函数
--一个是加密一个是解密,总共有三种模式可选择base64, hex, escape
SELECT ENCODE('lueluelue','hex')
SELECT DECODE('MzIxNzA1NDEyNQ==','base64')::VARCHAR;


--也有函数直接叫md5
SELECT md5('base64')::VARCHAR;

当然不同数据库基本上都会提供这几种普遍的加密方式的函数,大家相应的去百度下,应该是可以找到

甚至有些网站可以帮你加密和解密:https://escape.supfree.net/

这里有gp的相关函数整理:(作者:pmars)https://www.cnblogs.com/pmars/archive/2013/02/17/2914046.html

3.某些框架(大数据框架)

这里的某些框架指的是hive,spark等。

在使用这类框架的时候,我们应该首先考虑哪种方式最方便和兼容性,举个例子,在没有特殊要求的情况下,我们更倾向于用sql或者说用框架自带的函数来解决问题,但是如果有特殊需求,那还是要按照需求来。

以hive为例:

--MD5
select md5('12sasc');
结果:9bcb80f73724ceae1880c73001518a4b

--hex有两种传参
--一种是字符串,将返回该字符串的十六进制表示
--一种是数值,将该数字转换为十六进制
select hex(15);
结果:F

select hex('12gasg3g');
结果:3132676173673367

select unhex(3132676173673367);
结果:12gasg3g


--base64
--base64必须传入binary这种二进制的类型,所以一般与cast结合使用
select base64(cast('abc' as binary));
结果:YWJj

select unbase64('YWJj');
结果:abc

当然hive这种能够编写自定义函数的框架,你也可以通过编写java代码来完成自定义函数,关于如何创建UDF,大家请看:(作者:爆发的~小宇宙)https://blog.csdn.net/yu0_zhang0/article/details/79060849,整理的非常的清晰。但是我多一句嘴,能用框架原生的函数就用,别老想着自己加东西,这会令维护成本大大提高。

当然spark编写代码的框架要使用自定义的函数就更方便快捷了,给大家一个小例子:

public class UDFTest {
    public static void main(String[] args) {
		SparkSession spark = SparkSession.builder()
		.master("local[*]")
		.appName("UDFTest")
		.enableHiveSupport()
		.getOrCreate();
		
		//定义接受两个字符串参数,返回字符串数组的函数
		spark.udf().register("geoHashEncode", new UDF2<String, String, String[]>() {
			public String[] call(String longitude, String latitude) throws Exception {
			//...各种代码逻辑
			
			//返回处理好的字符串数组
			return new String[]{lonStr, latStr};
        }
		//最后指定这个函数的返回类型是hive中的array<String>类型
        }, DataTypes.createArrayType(DataTypes.StringType));
		
		//使用的时候只能通过sparksql的方式来调用(类似调用hive的函数)
		spark.sql("select a,b,geoHashEncode(a,b) as c from temp").show();
		
		spark.close();
}

 

好,其实这篇文章我一直觉得很难整理,先写到这吧,如果有想到什么其他的东西,我再往里面写。

大家要是有什么疑问的话,可以给我留言,我会及时回复,或者更新该文章!~

菜鸡一只,如果有说错的还请大家批评指出!!~

猜你喜欢

转载自blog.csdn.net/lsr40/article/details/82426881