最新历史版本 :SparkSQL編碼、加密、解密函式 返回文檔
編輯時間: 內容長度:图片数:目录数: 修改原因:

目錄:

1. 概述编辑

1.1 版本

FineDataLink 版本
功能說明
--
4.1.5.1新增加密函式和解密函式

1.2 功能說明

「編碼函式」、「加密函式」、「簽章函式」等常用於進行API加密認證取數時的 Token 生成。

本文主要介紹 FineDataLink 中 SparkSQL 算子支援的編碼函式、環境變數等。

文檔使用範例詳情參見:

2. 環境變數编辑

注1:相關函式預設大寫。

注2:如需要引入字串,字串不區分單雙引號。

名稱
說明範例
UUID隨機字串

SELECT UUID()

注:不支援改變長度

UNIX_TIMESTAMP時間戳(Timestamp)SELECT unix_timestamp()

範例:

例如,使用者需要使用「沃豐API」取數,API鑑權方式需要使用 unix time,nonce 為請求的唯一標識,值是由呼叫者提供的任意字串,15分鐘內此字串只能被使用一次;在這裏我們使用 SQL 的 uuid 函式生成。因此需要使用上述兩個環境變數。

直接將 SparkSQL 作為輸入源,輸入 SQL 語句:

SELECT	UNIX_TIMESTAMP(now()) AS time_str,	UUID() AS uuid_str;

即可使用環境變數,取出兩個指定的值,如下圖所示:

3. 編碼解碼函式编辑

注1:相關函式預設大寫。

注2:如需要引入字串,字串不區分單雙引號:。

名稱
函式範例
BASE16BASE16(expr)

SELECT BASE16('FineDataLink')

base64base64(expr)

轉換 expr 為 base 64 字元

select base64(cast('abcd' as binary))

unbase64

unbase64(expr)

注:括號內的資料需要是 Base64 編碼的字串

以二進制形式傳回已解碼的 base64 字串

範例一:

「Spark SQL 算子」中輸入:select unbase64('YWJjZA==')

範例二:

1)使用 base64 函式,編碼字串

編碼後資料如下圖所示:

2)再使用 unbase64 函式,解碼使用 base64 函式編碼後的字串

效果如下圖所示:

URLENCODEURLENCODE(expr)SELECT URLENCODE('FineDataLink')

unhex

unhex(expr) 

select unhex('537061726B2053514C')

回傳值:Spark SQL 

hex

hex(expr)

select hex('Spark SQL')

回傳值:537061726B2053514C 

encodeencode(str, charset)

SELECT encode('abc', 'utf-8');

回傳值:abc

decodedecode(bin, charset)

SELECT decode(encode('abc', 'utf-8'), 'utf-8');

回傳值:abc

4. 加密函式编辑

注1:相關函式預設大寫。

注2:如需要引入字串,字串不區分單雙引號:。

名稱函式參數說明格式與回傳值FDL的SparkSQL算子內用法
MD5MD5(expr)
-

範例:SELECT MD5('FineDataLink')

SHASHA(expr)--

範例:SELECT SHA('FineDataLink')

SHA1SHA1(expr)--

範例:SELECT SHA1('FineDataLink')

SHA2

SHA2(expr, bitLength)


--

注:bitLength為SHA2的位數,支援SHA-224、SHA-256、SHA-384和 SHA-512,預設為SHA256。

範例:SELECT SHA2('FineDataLink',256)

RSARSA(expr,secretKey,keyFormat)--

注:secretKey為輸入金鑰、格式為base64編碼,keyFormat為金鑰格式、值為'PKCS1'和'PKCS8'(不區分格式的大小寫),本函式回傳值格式也為base64編碼

範例:SELECT RSA( 'FineDataLink' , 'MIIBCgKCAQEAnLdoA3ba57YHBAenYbLGTcdC48VVvVVDXV6N/W+1FztBRjvNPV1D
MOcIJBrveTlgKug2PCVynaIttaNql6p/+Bm4G41kyZYy7RSaUCaJ3ryjcXsKfClt
nG9vCwbIN+bVchxRzj739zIA1tBHn9v22PhFcEfsSAy2G2EwM4bQ38n2UrMse9wb
LUGT0kzyquwPQs7vriU+1XBkrdssoAqbwgW5yUqxDosYB5h7D1YTW0qKkJ6PPNnL
XbMv2Meyjxq1sbWoF/m8uboaKklqal1ep5UqTp9OFNOaTrVyXY4Gkt7wq3OoNvk9
2cJ1fHz9wnriGo+oNut9gQr1WVjOzRkAwwIDAQAB' , 'PKCS1')

AES

注:4.1.5.1開始支援。

aes_encrypt(expr, key[, mode[, padding[, iv[, aad]]]])
  • expr:需要加密的正文

  • key:加密金鑰

  • mode:加密模式,有效值有ECB、GCM(可選)

  • padding:指定填充長度的方式,有效值有PKCS、NONE、DEFAULT(可選)


SELECT hex(aes_encrypt('Spark', '0000111122223333'));

DES

注:4.1.5.1開始支援。

des_encrypt(plainText, key, mode, padding, iv)

plainText:明文,需要加密的正文

plainText:正文


key:正文格式或者byte陣列格式,十六進制格式的金鑰使用unhex、Base64格式的金鑰使用unbase64。例如:"miyao", unhex("123def"), unbase64("some_base64_string")


回傳值:byte陣列,若要視覺化需要套一層hex或者base64,例如:hex(des_encrypt(...)), base64(des_encrypt(...))

範例:

SELECT hex(des_encrypt(`Roxy@fanraun.com`,`my8bytky`,`ECB`,`PKCS5`,null))

key:金鑰
mode:加密模式,合法的值為ECB(預設)、CBC、CFB、OFB、CTR。如果傳null,則為ECB加密,傳非法值報錯
padding:填充模式,合法的值為PKCS5(預設)、ISO10126、no。如果傳null,則為PKCS5填充,傳非法值報錯,不區分大小寫

iv:初始向量,CBC、CFB、OFB模式必傳,其他模式傳null即可

sm4

注:4.1.5.1開始支援。

sm4_encrypt(plainText, key, mode, iv)plainText:需要加密的正文

plainText:正文


key:正文格式或者byte陣列格式,十六進制格式的金鑰使用unhex、Base64格式的金鑰使用unbase64。例如:"miyao", unhex("123def"), unbase64("some_base64_string")


回傳值:byte陣列,若要視覺化需要套一層hex或者base64,例如:hex(sm4_encrypt(...)), base64(sm4_encrypt(...))

範例:

SELECT BASE64(sm4_encrypt('spark', unhex('30303030313131313232323233333333'), 'ECB', null));

O6F0JI1MwSQkSbU9Bjgb4A==

SELECT BASE64(sm4_encrypt('spark', '0000111122223333', 'ECB', null));

O6F0JI1MwSQkSbU9Bjgb4A==

key:金鑰
mode:加密模式,合法的值為ECB(預設)、CBC、CFB、OFB、CTR。如果傳null,則為ECB加密,傳非法值報錯

iv:初始向量,CBC模式必傳,若為ECB模式請傳null

填充模式固定為PKCS7

sm2

注:4.1.5.1開始支援。

sm2_encrypt(plainText, publicKey)

plainText:需要加密的正文

publicKey:接收者的公用鍵

加密模式固定為新版C1C3C2

publicKey:十六進制資料


回傳值:Base64編碼

SELECT sm2_encrypt('spark', '04BDE0D3CBC2D3472AFAD7D020DDB3A8C3A8C22914E5E29753DF12EA91A199E2E1D9F0821EFEDB622D56DA4B719B62C7342852C0C42C84C4C83102761B678CF39F');

回傳值:

BEucJcdQXwOxg7HRgZ8eWY00d2giXuEy6q5aI1w3QyVTH/np9LV4YrTfMOYCsQi3sGK6j/WP2UevXUb25g55Pri+Kqp97qfxxnxF655267XYBoHXyeWG/lCf1ZIzOk5GdHcz6UKh

sm2_encrypt_C1C2C3(plainText, publicKey)

plainText:需要明文

publicKey:公用鍵

加密模式固定為舊版C1C2C3

publicKey:十六進制資料


回傳值:Base64編碼

SELECT sm2_encrypt_C1C2C3('spark', '04BDE0D3CBC2D3472AFAD7D020DDB3A8C3A8C22914E5E29753DF12EA91A199E2E1D9F0821EFEDB622D56DA4B719B62C7342852C0C42C84C4C83102761B678CF39F');

回傳值:

BJYqv1G2F7sSeC8/u2oHp5HBbg6KH9P0AmjtjT5hDcwXvBpLYLDVGZ8J7MvF8la3sMryd9hWTkxA/AOHlQLF5xa3Ko9X/+zgoNOR3pmY9P2pw9+hwO6e/xI4rgld1P2qdy9AAJ5W

範例:

本文第三節中獲取了timestamp、nonce 兩個值,簽章 sign 為 email 、open_api_token、timestamp、nonce、sign_version 共同組合生成 sign=SHA256(email&open_api_token&timestamp&nonce&sign_version),使用了加密函式。

緊接着本文第五節的算子,新增 SparkSQL 並輸入

SELECT SHA2(CONCAT("email&open_api_token",time_str,"&",uuid_str,"&v2") ,256) as sign_str,time_str,uuid_str from SparkSQL


5. 解密函式编辑

注:4.1.5.1開始支援。

名稱函式參數說明格式與回傳值FDL的SparkSQL算子內用法
AESaes_decrypt(expr, key[, mode[, padding[, aad]]]) 
  • expr:需要解密的正文

  • key:加密金鑰

  • mode:加密模式,有效值有ECB、GCM

  • padding:指定填充長度的方式,有效值有PKCS、NONE、DEFAULT


SELECT aes_decrypt(unhex('83F16B2AA704794132802D248E6BFD4E380078182D1544813898AC97E709B28A94'), '0000111122223333');
DESdes_decrypt(cipherText, key, mode, padding, iv)cipherText:需要解密的密文

cipherText:正文或者byte陣列格式,十六進制格式的密文使用unhex、Base64格式的密文使用unbase64。。例如:"miwen", unhex("123def"), unbase64("some_base64_string")


範例:SELECT des_decrypt(unhex('f0ecd50abef6bc01da5d0af7da1bdfb8879f8ec06c2d3837'),'my8bytky','CBC','PKCS5','12345678')

果:user@example.com


key:金鑰
mode:模式,合法的值為ECB(預設)、CBC、CFB、OFB、CTR。如果傳null,則為ECB加密,傳非法值報錯
padding:填充模式,合法的值為PKCS5(預設)、ISO10126、no。如果傳null,則為PKCS5填充,傳非法值報錯,不區分大小寫
SM4sm4_decrypt(cipherText, key, mode, iv)

expr:需要解密的正文



cipherText:正文或者byte陣列格式,十六進制格式的密文使用unhex、Base64格式的密文使用unbase64。例如:"miwen", unhex("123def"), unbase64("some_base64_string")


key:正文格式或者byte陣列格式,十六進制格式的金鑰使用unhex、Base64格式的金鑰使用unbase64。例如:"miyao", unhex("123def"), unbase64("some_base64_string")


回傳值:正文

SELECT sm4_decrypt(unbase64('O6F0JI1MwSQkSbU9Bjgb4A=='), unhex('30303030313131313232323233333333'), 'ECB', null);

回傳值:spark


SELECT sm4_decrypt(unbase64('O6F0JI1MwSQkSbU9Bjgb4A=='), '0000111122223333', 'ECB', null);

回傳值:spark


key:加密金鑰

mode:加密模式,合法的值為ECB(預設),CBC。如果傳null,則為ECB加密,傳非法值報錯

iv:初始向量,CBC模式必傳,若為ECB模式請傳null

填充模式固定為PKCS7

SM2

sm2_decrypt(cipherText, privateKey)

expr:需要解密的正文

key:接收者的私密金鑰

cipherText:Base64編碼的正文


privateKey:十六進制資料


回傳值:正文

SELECT sm2_decrypt('BEucJcdQXwOxg7HRgZ8eWY00d2giXuEy6q5aI1w3QyVTH/np9LV4YrTfMOYCsQi3sGK6j/WP2UevXUb25g55Pri+Kqp97qfxxnxF655267XYBoHXyeWG/lCf1ZIzOk5GdHcz6UKh','160430D73E9284086AF3B0D4B1D2EB2E40E00637D5288B6B0A736B2EF78AAEC6');

回傳值:spark

sm2_decrypt_C1C2C3(cipherText, privateKey)

cipherText:需要解密的正文

privateKey:接收者的私密金鑰

cipherText:Base64編碼的正文


privateKey:十六進制資料


回傳值:正文

SELECT sm2_decrypt_C1C2C3('BJYqv1G2F7sSeC8/u2oHp5HBbg6KH9P0AmjtjT5hDcwXvBpLYLDVGZ8J7MvF8la3sMryd9hWTkxA
/AOHlQLF5xa3Ko9X/+zgoNOR3pmY9P2pw9+hwO6e/xI4rgld1P2qdy9AAJ5W','160430D73E9284086AF3B0D4B1D2EB2E40E00637D5288B6B0A736B2EF78AAEC6');

回傳值:

spark

RSArsa_decrypt(cipherText, privateKey, keyFormat)

cipherText:需要解密的密文

privateKey:私密金鑰

keyFormat:金鑰格式、值為'PKCS1'和'PKCS8'(不區分格式的大小寫)

cipherText:Base64編碼的正文


privateKey:Base64編碼的金鑰


回傳值:正文

SELECT
  rsa_decrypt('Xi/4Y2dsOFqbqpDXHGpqXZMWnbN5/t5OxFsqvOFBs+TVLWX9IiV5Ch63aFD9/SgG/ws2SOKhLhGJiIhuNQmS3w==','MIIBOAIBAAJAbN3FUygwojWFHamHJ5hhX2QvFSgRCAEuph1bqwh3kzi8uKj7A1So
P4etzUY8zeda4eBNdy15uBSbHagY/N2JkQIDAQABAkAO7pgrIL8S8J5ShDcqgicQ
62/dygIUA/1/AVXabq3f/mFwUppR/A7wopSB2eDdNPLyws5trUuF6ht1vbqFM0nl
AiEAp7q9AY0ZnM1PAv/Ef0eRZCmMtxHWbK5ckQo06iSuNHMCIQCmKLmTi901LVCz
Gz6CSRUOHBiolJEHa+0HUVvD/goM6wIgHc2bmfP1chw1BuZlhuwzlGWhoEHmJOeS
gR8cKeKcpasCIB/9DSUbsx2OuM+SeilI+pW50QF7gKRGId7byefkm3i7AiB9DDuP
mxDvGmv+vyiIlEtelk1nPXoMKAFdy19q3zA9Cg==','PKCS1');

回傳值:

spark

範例:例如使用解密函式,輸入:SELECT des_decrypt(unhex('f0ecd50abef6bc01da5d0af7da1bdfb8879f8ec06c2d3837'),'my8bytky','CBC','PKCS5','12345678'),得到解密值如下圖所示:

6. 簽章函式编辑

注1:相關函式預設大寫。

注2:如需要引入字串,字串不區分單雙引號:。

名稱函式參數說明格式與回傳值FDL的SparkSQL算子內用法
HMAC-MD5HMACMD5(expr,secretKey,format)

  • secretKey為輸入金鑰,format格式值可選為'HEX'或'BASE64'(不區分格式的大小寫)



SELECT HMACMD5( 'FineDataLink' , 'Im a secret key' , 'HEX')
HMAC-SHA1HMACSHA1(expr,secretKey,format)secretKey為輸入金鑰,format格式值可選為'HEX'或'BASE64'(不區分格式的大小寫)



SELECT HMACSHA1( 'FineDataLink' , 'Im a secret key' , 'HEX')


HMAC-SHA256HMACSHA256(expr,secretKey,format)secretKey為輸入金鑰,format格式值可選為'HEX'或'BASE64'(不區分格式的大小寫)
SELECT HMACSHA256( 'FineDataLink' , 'Im a secret key' , 'HEX')

SM3

注:4.1.5.1開始支援。

sm3(expr) expr:要簽章的正文回傳值:十六進制字串

範例:

SELECTsm3('spark');

回傳值:
16CF694758A1BD2A93C6AA91389918908BFEDD14D9A95F567B557306B681C41C

SM2

注:4.1.5.1開始支援。

sm2_sign(data, privateKey)

data:要簽章的資料

privateKey:私密金鑰十六進制資料

十六進制資料

範例:

SELECT sm2_sign('FineDataLink'
,'9DAEF71B895D6C6E0CD0BE09E1B6A3356144892D6A03E46065EBA7EF24EDF3E3');

7. 附錄编辑

sm2 金鑰線上生成網站:https://config.net.cn/tools/SM2.html

sm4 金鑰線上生成網站:https://config.net.cn/tools/SM4.html

RSA 金鑰線上生成網站:http://www.metools.info/code/c80.html