【資料加密/脫敏】各種資料庫、程式碼加密/解碼的方法
本人菜雞一隻,閱讀該文章之前,有句話我得先說一下:
本文不是來介紹加密演算法的,也不是來解釋加密演算法的過程的。如果本意想研究加密演算法的實現,或者概念。不好意思本文可能囉哩叭嗦還幫不上忙!
前言:
資料加密,也就是資料脫敏。其實就是將一些涉及不是本人就不該看的欄位資料通過某些方法,讓別人就算拿到了資料也看不懂或者解析不出關鍵資訊。
當然加密總體上分兩種,一種是可還原,一種是不可還原(當然只是相對不可還原,不排除某些加密演算法最後被破解並且被證明可逆),可逆演算法一般來說是為了資料傳輸的時候不用明文傳輸,然後和對方約定好加密方式,讓約定好的雙方才能夠看懂資訊,當然戰爭時期,什麼諜戰片就會有那種截獲敵方傳送的報文,然後破譯敵方軍事機密的橋段,例如電影:《廚子戲子痞子》
正文:
一、不可逆
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();
}
好,其實這篇文章我一直覺得很難整理,先寫到這吧,如果有想到什麼其他的東西,我再往裡面寫。
大家要是有什麼疑問的話,可以給我留言,我會及時回覆,或者更新該文章!~
菜雞一隻,如果有說錯的還請大家批評指出!!~