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:如需要引入字串,字串不區分單雙引號:。
| 名稱 | 函式 | 範例 |
|---|---|---|
| BASE16 | BASE16(expr) | SELECT BASE16('FineDataLink') |
| base64 | base64(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 函式編碼後的字串
效果如下圖所示:
|
| URLENCODE | URLENCODE(expr) | SELECT URLENCODE('FineDataLink') |
unhex | unhex(expr) | select unhex('537061726B2053514C') 回傳值:Spark SQL |
hex | hex(expr) | select hex('Spark SQL') 回傳值:537061726B2053514C |
| encode | encode(str, charset) | SELECT encode('abc', 'utf-8'); 回傳值:abc |
| decode | decode(bin, charset) | SELECT decode(encode('abc', 'utf-8'), 'utf-8'); 回傳值:abc |
4. 加密函式编辑
注1:相關函式預設大寫。
注2:如需要引入字串,字串不區分單雙引號:。
| 名稱 | 函式 | 參數說明 | 格式與回傳值 | FDL的SparkSQL算子內用法 |
|---|---|---|---|---|
| MD5 | MD5(expr) | - | 範例:SELECT MD5('FineDataLink') | |
| SHA | SHA(expr) | - | - | 範例:SELECT SHA('FineDataLink') |
| SHA1 | SHA1(expr) | - | - | 範例:SELECT SHA1('FineDataLink') |
| SHA2 | SHA2(expr, bitLength) | - | - | 注:bitLength為SHA2的位數,支援SHA-224、SHA-256、SHA-384和 SHA-512,預設為SHA256。 範例:SELECT SHA2('FineDataLink',256) |
| RSA | RSA(expr,secretKey,keyFormat) | - | - | 注:secretKey為輸入金鑰、格式為base64編碼,keyFormat為金鑰格式、值為'PKCS1'和'PKCS8'(不區分格式的大小寫),本函式回傳值格式也為base64編碼 範例:SELECT RSA( 'FineDataLink' , 'MIIBCgKCAQEAnLdoA3ba57YHBAenYbLGTcdC48VVvVVDXV6N/W+1FztBRjvNPV1D |
AES 注:4.1.5.1開始支援。 | aes_encrypt(expr, key[, mode[, padding[, iv[, aad]]]]) |
| 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== 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×tamp&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算子內用法 |
|---|---|---|---|---|
| AES | aes_decrypt(expr, key[, mode[, padding[, aad]]]) |
| SELECT aes_decrypt(unhex('83F16B2AA704794132802D248E6BFD4E380078182D1544813898AC97E709B28A94'), '0000111122223333'); | |
| DES | des_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填充,傳非法值報錯,不區分大小寫 | ||||
| SM4 | sm4_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 回傳值: spark | |
| RSA | rsa_decrypt(cipherText, privateKey, keyFormat) | cipherText:需要解密的密文 privateKey:私密金鑰 keyFormat:金鑰格式、值為'PKCS1'和'PKCS8'(不區分格式的大小寫) | cipherText:Base64編碼的正文 privateKey:Base64編碼的金鑰 回傳值:正文 | SELECT 回傳值: spark |
範例:例如使用解密函式,輸入:SELECT des_decrypt(unhex('f0ecd50abef6bc01da5d0af7da1bdfb8879f8ec06c2d3837'),'my8bytky','CBC','PKCS5','12345678'),得到解密值如下圖所示:

6. 簽章函式编辑
注1:相關函式預設大寫。
注2:如需要引入字串,字串不區分單雙引號:。
| 名稱 | 函式 | 參數說明 | 格式與回傳值 | FDL的SparkSQL算子內用法 |
|---|---|---|---|---|
| HMAC-MD5 | HMACMD5(expr,secretKey,format) |
| SELECT HMACMD5( 'FineDataLink' , 'Im a secret key' , 'HEX') | |
| HMAC-SHA1 | HMACSHA1(expr,secretKey,format) | secretKey為輸入金鑰,format格式值可選為'HEX'或'BASE64'(不區分格式的大小寫) | SELECT HMACSHA1( 'FineDataLink' , 'Im a secret key' , 'HEX') | |
| HMAC-SHA256 | HMACSHA256(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'); 回傳值: |
SM2 注:4.1.5.1開始支援。 | sm2_sign(data, privateKey) | data:要簽章的資料 privateKey:私密金鑰(十六進制資料) | 十六進制資料 | 範例: SELECT sm2_sign('FineDataLink' |
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








