本人菜鸡一只,阅读该文章之前,有句话我得先说一下:
本文不是来介绍加密算法的,也不是来解释加密算法的过程的。如果本意想研究加密算法的实现,或者概念。不好意思本文可能啰哩叭嗦还帮不上忙!
前言:
数据加密,也就是数据脱敏。其实就是将一些涉及不是本人就不该看的字段数据通过某些方法,让别人就算拿到了数据也看不懂或者解析不出关键信息。
当然加密总体上分两种,一种是可还原,一种是不可还原(当然只是相对不可还原,不排除某些加密算法最后被破解并且被证明可逆),可逆算法一般来说是为了数据传输的时候不用明文传输,然后和对方约定好加密方式,让约定好的双方才能够看懂信息,当然战争时期,什么谍战片就会有那种截获敌方发送的报文,然后破译敌方军事机密的桥段,例如电影:《厨子戏子痞子》
正文:
一、不可逆
1.大名鼎鼎的MD5
2.我不太了解的SHA
二、可逆
一般常见的有:(可能是我所知道的吧,但是其实我是个孤陋寡闻的人)
1.hex
2.escape
3.base64
三、使用
我会比较大篇幅的来说明不同地方的使用方式。
1.代码(各种语言)
我想通过代码实现是最繁琐的方式了,不同语言肯定会提供不同的库或者包,通过引用这些包就可以将字符串加密
比如MD5的java实现
(作者:zhaojiaxing0216)https://blog.youkuaiyun.com/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.youkuaiyun.com/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();
}
好,其实这篇文章我一直觉得很难整理,先写到这吧,如果有想到什么其他的东西,我再往里面写。
大家要是有什么疑问的话,可以给我留言,我会及时回复,或者更新该文章!~
菜鸡一只,如果有说错的还请大家批评指出!!~