添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

示例:

例如,用户需要使用「沃丰接口」取数,接口鉴权方式需要使用 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.png

编码后数据如下图所示:

1726628518495159.png

2)再使用 unbase64 函数,解码使用 base64 函数编码后的 字符串

4.png

效果如下图所示:

1726628668686094.png

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
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(`[email protected]`,`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算子内用法
AES aes_decrypt(expr, key[, mode[, padding[, aad]]])
  • expr:需要解密的文本

  • key:加密 密钥

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

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


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' )

果:[email protected]


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
/AOHlQLF5xa3Ko9X/+zgoNOR3pmY9P2pw9+hwO6e/xI4rgld1P2qdy9AAJ5W','160430D73E9284086AF3B0D4B1D2EB2E40E00637D5288B6B0A736B2EF78AAEC6');

返回值:

spark

RSA rsa_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-MD5 HMACMD5(expr,secretKey,format)

  • secretKey为输入的 密钥 ,format格式值可选为'HEX'或'BASE64'(不区分格式的大小写)



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');

返回值:
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