1. 程式人生 > >【資料加密/脫敏】各種資料庫、程式碼加密/解碼的方法

【資料加密/脫敏】各種資料庫、程式碼加密/解碼的方法

本人菜雞一隻,閱讀該文章之前,有句話我得先說一下:

本文不是來介紹加密演算法的,也不是來解釋加密演算法的過程的。如果本意想研究加密演算法的實現,或者概念。不好意思本文可能囉哩叭嗦還幫不上忙!

前言:

資料加密,也就是資料脫敏。其實就是將一些涉及不是本人就不該看的欄位資料通過某些方法,讓別人就算拿到了資料也看不懂或者解析不出關鍵資訊。

當然加密總體上分兩種,一種是可還原,一種是不可還原(當然只是相對不可還原,不排除某些加密演算法最後被破解並且被證明可逆),可逆演算法一般來說是為了資料傳輸的時候不用明文傳輸,然後和對方約定好加密方式,讓約定好的雙方才能夠看懂資訊,當然戰爭時期,什麼諜戰片就會有那種截獲敵方傳送的報文,然後破譯敵方軍事機密的橋段,例如電影:《廚子戲子痞子》

正文:

一、不可逆

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();
}

 

好,其實這篇文章我一直覺得很難整理,先寫到這吧,如果有想到什麼其他的東西,我再往裡面寫。

大家要是有什麼疑問的話,可以給我留言,我會及時回覆,或者更新該文章!~

菜雞一隻,如果有說錯的還請大家批評指出!!~