10、加密函数



10、加密函数

0、概述

单一密钥加密:支持生成单一密钥,需要自行保存生成的密钥,适用于对指定列做随机性加密或解密。

分类函数功能
单一密钥加密SYM_DECRYPT对表里的指定已经随机性加密的列做解密,返回BINARY类型的明文。
单一密钥加密SYM_ENCRYPT对表里的指定列做随机性加密,返回BINARY类型的密文。

在这里插入图片描述

  • 多密钥加密:MaxCompute密钥管理对象Keyset,可以存放1个或多个密钥,您可以手动在Keyset中增加密钥,密钥的轮转和查看原始密钥。
函数功能
NEW_KEYSET根据指定的算法类型,创建对应的密钥Keyset。
ADD_KEY_TO_KEYSET在Keyset中新增密钥,并将新增的密钥设置为主密钥。
KEYSET_TO_JSON将BINARY类型的密钥Keyset转化为可读的JSON格式,以便查看密钥Keyset详情。
KEYSET_FROM_JSON将JSON类型的keyset转化为BINARY类型。
ROTATE_KEYSET系统自动生产一个新密钥并将新密钥设置为主密钥。

在这里插入图片描述

结合KMS封装的多密钥加密:MaxCompute支持结合KMS进行数据加密,系统会自动生成加解密数据的密钥集(Keyset),该Keyset与KMS密钥结合生成Keyset_KMS,用户需要保存keyset_KMS。若需要数据解密时,需要提供Keyset_KMS,然后系统会结合KMS密钥对Keyset_KMS进行解密,还原成加密数据的Keyset并对数据进行解密。

函数功能
NEW_WRAPPED_KEYSET将有权使用KMS用户主密钥资源名称(kms_cmk_arn)角色的role_arn授权给MaxCompute,用来新建一个封装密钥集(KEYSET),也可通过角色链(role_chain)方式授权给其他阿里云账号解密KEYSET的权限。
REWRAP_KEYSET通过指定的KMS密钥重新加密封装密钥集(KEYSET)。
ROTATE_WRAPPED_KEYSET解密已有的加密密钥集(KEYSET),并进行密钥轮转,然后通过新密钥加密。
USE_WRAPPED_KEYSET将封装密钥集转换为基础密钥集,作为加解密函数的参数使用,您也可通过此函数,获得封装密钥集相关的信息,并保存起来,便于维护。
ENHANCED_SYM_ENCRYPT指定密钥集进行数据加密。
ENHANCED_SYM_DECRYPT指定密钥集进行数据解密。

在这里插入图片描述

1、单一密钥加密

  • SYM_DECRYPT:对表里的指定已经随机性加密的列做解密,返回BINARY类型的明文。
binary sym_decrypt(binary <value_to_decrypt>,
                   binary <key>
                   [,string <encryption_method> ,
                    [ string <additional_authenticated_data> ]
                   ]
                  )
  • 入参:
    • value_to_decrypt:必填。待解密数据。目前只支持对BINARY类型的数据进行解密。
    • key:必填。解密使用的密钥。支持的数据类型为BINARY,长度为256bits。
    • encryption_method:可选。数据用指定模式加密,解密时需要选择同样的模式进行解密。
    • additional_authenticated_data:可选。附加身份验证数据AAD,可以用来验证数据的真实性和完整性,数据在加密时用了ADD,解密时就需要输入ADD。
-- 123456789
SELECT sym_decrypt(
    unbase64('XZGEaAEAcHHrhIISRc0IEMP8dIGwmLs3QyApJJG3m6lsb71D3g==')
    ,cast('b75585cf321cdcad42451690cdb7bfc4' AS binary)
);

-- 123456789
SELECT sym_decrypt(
    unbase64('n5GEaAEAsFJ8uYISOWH4f6waLXEYfknvWXqIU4xRxOTiS//HMA==')
    ,cast('b75585cf321cdcad42451690cdb7bfc4' AS binary)
    ,'AES-GCM-256'
    ,'test'
);

  • SYM_ENCRYPT:对表里的指定列做随机性加密,返回BINARY类型的密文。
binary sym_encrypt(string|binary <value_to_encrypt>,
                   binary <key>
                   [,string <encryption_method> ,
                      [ string <additional_authenticated_data> ]
                    ]
                  )
  • 入参
    • value_to_encrypt:必填。待加密数据。目前只支持对STRING和BINARY类型的数据进行加密。
    • key:必填。加密使用的密钥。支持的数据类型为BINARY,长度为256bits。
    • encryption_method:可选。加密模式选择。目前只提供了一种加密模式,即AES-GCM-256加密算法,默认使用AES-GCM-256。
    • additional_authenticated_data:可选。附加身份验证数据AAD,可以用来验证数据的真实性和完整性。目前只支持AEAD的加密算法,比如AES GCM才支持AAD。
-- XZGEaAEAcHHrhIISRc0IEMP8dIGwmLs3QyApJJG3m6lsb71D3g==
SELECT BASE64(
    sym_encrypt('123456789'
        ,cast('b75585cf321cdcad42451690cdb7bfc4' AS binary)
    )
);
-- n5GEaAEAsFJ8uYISOWH4f6waLXEYfknvWXqIU4xRxOTiS//HMA==
SELECT BASE64(
    sym_encrypt('123456789'
        ,cast('b75585cf321cdcad42451690cdb7bfc4' AS binary)
        ,'AES-GCM-256'
        ,'test'
    )
);

2、多密钥加密

  • NEW_KEYSET:根据指定的算法类型,创建对应的密钥Keyset。
binary NEW_KEYSET(string <key_type>, [string <description>])
  • 入参
    • key_type:必填,创建数据密钥时,指定的算法类型。目前支持:AES-GCM-256、AES-SIV-CMAC-128和AES-SIV-CMAC-256。
      description:可选,数据密钥的描述。
-- 0A10645A61456141454173426F666D59495312520A330A0B4145532D47434D2D3235361220FA2137E09C024F70F6C3D309B86F3FC6E861EF09DDFFD13088CBCC076615AF561801200210011A10645A61456141454173426F666D59495320022A0568656C6C6F
SELECT hex(new_keyset('AES-GCM-256','hello'));
  • ADD_KEY_TO_KEYSET:在Keyset中新增密钥,并将新增的密钥设置为主密钥。
binary ADD_KEY_TO_KEYSET(binary <keyset>, string <key_type>, binary <raw_key>, [string <description>])
  • 入参
    • keyset:必填,已有密钥,类型为:BINARY。
    • key_type:必填:添加密钥的算法类型。目前支持:AES-GCM-256、AES-SIV-CMAC-128和AES-SIV-CMAC-256。
    • raw_key:必填,待新增的密钥,并将此密钥设置为主密钥,类型为:BINARY。
    • description:可选,对数据密钥的描述。
select hex(ADD_KEY_TO_KEYSET(unhex ('0A1072384D715A414541385044643351534C12580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64'), 'AES-SIV-CMAC-128', unhex('b75585cf321cdcad42451690cdb7bfc49c26092f60f854e72d43244c55620a3d'),'description') );
  • KEYSET_TO_JSON:将BINARY类型的密钥Keyset转化为可读的JSON格式,以便查看密钥Keyset详情。
STRING KEYSET_TO_JSON(BINARY <keyset>)
SELECT KEYSET_TO_JSON(unhex ('0A1072384D715A414541385044643351534C12580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64')) ;
 +------------+
| _c0        |
+------------+
| {
    "key": [{
            "description": "hello world",
            "key_id": "r8MqZAEA8PDd3QSL",
            "key_meta_data": {
                "key_material_origin": "Origin_ALIYUN_MAXCOMPUTE",
                "key_material_type": "SYMMETRIC",
                "type": "AES-GCM-256",
                "value": "Jqj7ESbfT1td0DwYDmkZVl13FsuykYFe+1u/MPi++a8="},
            "output_prefix_type": "PREFIX_ALIYUN_MAXCOMPUTE",
            "status": "ENABLED"}],
    "primary_key_id": "r8MqZAEA8PDd3QSL"} |
+------------+
  • KEYSET_FROM_JSON:将JSON类型的keyset转化为BINARY类型。
binary KEYSET_FROM_JSON(string <json_keyset>)
select hex(KEYSET_FROM_JSON('{
    "key": [{
            "description": "hello world",
            "key_id": "r8MqZAEA8PDd3QSL",
            "key_meta_data": {
                "key_material_origin": "Origin_ALIYUN_MAXCOMPUTE",
                "key_material_type": "SYMMETRIC",
                "type": "AES-GCM-256",
                "value": "Jqj7ESbfT1td0DwYDmkZVl13FsuykYFe+1u/MPi++a8="},
            "output_prefix_type": "PREFIX_ALIYUN_MAXCOMPUTE",
            "status": "ENABLED"}],
    "primary_key_id": "r8MqZAEA8PDd3QSL"}')) ;
  • ROTATE_KEYSET:系统自动生产一个新密钥并将新密钥设置为主密钥。
binary ROTATE_KEYSET(binary <keyset>, string <key_type>, [string <description> ])
  • 入参
    • keyset:必填,待更新的Keyset,类型为BINARY。
    • key_type:必填,新的密钥算法类型,目前支持:AES-GCM-256、AES-SIV-CMAC-128和AES-SIV-CMAC-256。
    • description:可选,数据密钥的描述。
select ROTATE_KEYSET(unhex ('0A1072384D715A414541385044643351534C12580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64'), 'AES-SIV-CMAC-256', 'hello world') ;

3、结合KMS封装的多密钥加密

  • NEW_WRAPPED_KEYSET:将有权使用KMS用户主密钥资源名称(kms_cmk_arn)角色的role_arn授权给MaxCompute,用来新建一个封装密钥集(KEYSET),也可通过角色链(role_chain)方式授权给其他阿里云账号解密KEYSET的权限。
binary NEW_WRAPPED_KEYSET(string <kms_cmk_arn> , string <role-arn>, string <key_type>
[, string <description>, [string <role_chain>]])
select hex(NEW_WRAPPED_KEYSET('acs:kms:cn-hangzhou:1**************7:key/key-hzz****************1t','acs:ram::1**************7:role/kms', 'AES-GCM-256', 'hello'));
+-----+
| _c0 |
+-----+
| 613256354C576836656A59314D6D59344E7A6B7A624452754D6D3434627A49786443317A655859786358426F4E6A4D78434A373434582F54756C5A547A4E69337562786F4B3543412F616655573262786D345A41306B464C674A2F5758324F4E514E346746306F303236376D35335A6471797237366E57565A6836387A52687A4A673945784B6E677568794A376E6F4A68573677684B5A555A42786E4A383742536C4D46326A374F71474F4C414A6B665779694557394D58664876576E306C6D49777052746A77325643707A4259517277327944354343396C50586F31346A4351506253612F3044394C4C6E6E622F747A6B57316E4F564A6C5359354B35526130537565584F33507856773D |
+-----+

新建封装密钥集,并允许其他角色调用:

select hex(NEW_WRAPPED_KEYSET('acs:kms:cn-hangzhou:1**************7:key/key-hzz****************1t','acs:ram::1**************7:role/kms', 'AES-GCM-256', 'hello','acs:ram::1**************7:role/kms1'));
+-----+
| _c0 |
+-----+
| 613256354C576836656A59314D6D59344E7A6B7A624452754D6D3434627A49786443317A655859786358426F4E6A4D784D59716D4C767954716B3562444779574C7A387965774966432F516B4A59616F57623648364A546A62434F7A7A42634F517A687A6E526F36543866714E4E63555546566874696C4A3947713556667A2F7851757A55686467504C517A2B6C433337485A535449744B53714E396B6639587666487A4D7957643842334D3179392F67423774726835437A556F786A74614571612F5A3543447668524A7731426566525647796A77574974476243475A4E594550714E767963532B333432743347396B714777626C54336F57706939706E437A667A4E4D6F4C63714F453D |
+-----+
  • REWRAP_KEYSET:通过指定的KMS密钥重新加密封装密钥集(KEYSET)。
binary REWRAP_KEYSET(string <kms_cmk_arn> , string <role-arn>, string <wrapped_keyset>, [string <role_chain>])
-- 重新加密封装密钥集:
@origin_key := unhex('<wrapped_keyset>'); 
select hex(REWRAP_KEYSET('acs:kms:cn-hangzhou:1**************7:key/key-hzz******************', 'acs:ram::1**************7:role/kms', @origin_key));

-- 重新加密封装密钥集,并允许其他阿里云账号的角色调用:
@origin_key := unhex('<wrapped_keyset>');
@role_chain := 'acs:ram:${<UserAId>}:role/${<roleName2>},acs:ram:${<UserBId>}:role/${<roleName3>}';
select hex(REWRAP_KEYSET('acs:kms:cn-hangzhou:1**************7:key/key-hzz******************', 'acs:ram:${<UserId>}:role/${<roleName>}', @origin_key, @role_chain));
  • ROTATE_WRAPPED_KEYSET:解密已有的加密密钥集(KEYSET),并进行密钥轮转,然后通过新密钥加密。
binary ROTATE_WRAPPED_KEYSET(string <kms_cmk_arn> , string <role-arn>, string <wrapped_keyset>,string <key_type> [,string description,[string <role_chain>]])
-- 重新加密封装密钥集:
@kms_resource_keyId := 'acs:kms:${<RegionId>}:${<UserId>}:key/${<CmkId>}';
@role_arn := 'acs:ram:${<UserId>}:role/${<roleName>}';
@origin_key := unhex('<wrapped_keyset>');
select hex(ROTATE_WRAPPED_KEYSET(@kms_resource_keyId, @role_arn, @origin_key, 'AES-GCM-256', 'hello world'));

-- 重新加密封装密钥集,并允许其他角色调用:
@kms_resource_keyId := 'acs:kms:${<RegionId>}:${<UserId>}:key/${<CmkId>}';
@role_arn := 'acs:ram:${<UserId>}:role/${<roleName>}';
@origin_key := unhex('<wrapped_keyset>');
@role_chain := 'acs:ram:${<UserAId>}:role/${<roleName2>},acs:ram:${<UserBId>}:role/${<roleName3>}';
select hex(ROTATE_WRAPPED_KEYSET(@kms_resource_keyId, @role_arn, @origin_key, 'AES-GCM-256', 'hello world', @role_chain));
  • USE_WRAPPED_KEYSET:将封装密钥集转换为基础密钥集,作为加解密函数的参数使用,您也可通过此函数,获得封装密钥集相关的信息,并保存起来,便于维护。
binary USE_WRAPPED_KEYSET(string <kms_cmk_arn> , string <role-arn>, string <wrapped_keyset> [,string <role_chain>])
-- 获取封装密钥集的密钥算法信息:
@kms_resource_keyId := 'acs:kms:${<RegionId>}:${<UserId>}:key/${<CmkId>}';
@role_arn := 'acs:ram:${<UserId>}:role/${<roleName>}';
@origin_key := unhex('<wrapped_keyset>');
@role_chain := 'acs:ram:${<UserAId>}:role/${<roleName2>},acs:ram:${<UserBId>}:role/${<roleName3>}';
@use_keyset_new := USE_WRAPPED_KEYSET(@kms_resource_keyId, @role_arn, @origin_key, @role_chain);

select get_json_object(get_json_object(use_keyset_new.wrapped_keyset_info,'$.masked_keyset'), '$.key[0].key_meta_data.type');
  • ENHANCED_SYM_ENCRYPT:指定密钥集进行数据加密。
binary ENHANCED_SYM_ENCRYPT(binary <keyset> , string|binary <plaintext> [,string <additional_data>])
select id,
    name,
    gender,
       base64(ENHANCED_SYM_ENCRYPT(unhex ('0A1072384D715A414541385044643351534C12580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64'), id_card_no ))as id_card_no,
      tel
from mf_user_info;
  • ENHANCED_SYM_DECRYPT:指定密钥集进行数据解密。
binary ENHANCED_SYM_DECRYPT(binary <keyset> , binary <ciphertext> [,string <additional_data>])
insert overwrite table mf_user_info 
select id,
    name,
    gender,
       ENHANCED_SYM_DECRYPT(unhex ('0A1072384D715A414541385044643351534C12580A330A0B4145532D47434D2D323536122026A8FB1126DF4F5B5DD03C180E6919565D7716CBB291815EFB5BBF30F8BEF9AF1801200210011A1072384D715A414541385044643351534C20022A0B68656C6C6F20776F726C64'), unbase64(id_card_no) )as id_card_no,
      tel
from mf_user_info;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ha_lydms

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值