
文章目录一、分类总览1、函数分类2、全部函数二、加密能力基础1、定义2、区别3、简单记忆4、案例三、单一密钥加解密类1、定义2、区别3、简单记忆4、案例四、基础 Keyset 管理类1、定义2、区别3、简单记忆4、案例五、KMS封装Keyset管理类1、定义2、区别3、简单记忆4、案例六、增强加解密类1、定义2、区别3、简单记忆4、案例七、最容易混淆的函数对比八、常用案例1、身份证字段加密后存储2、解密后返回STRING3、创建Keyset4、轮转Keyset5、查看Keyset详情6、使用Keyset加密九、使用注意事项1、定义2、区别3、简单记忆4、案例十、参考资料一、分类总览1、函数分类分类主要解决的问题代表函数1、单一密钥加解密类使用单一BINARY密钥直接加密、解密字段SYM_ENCRYPT、SYM_DECRYPT2、基础 Keyset 管理类创建、追加、查看、恢复和轮转 KeysetNEW_KEYSET、ADD_KEY_TO_KEYSET、KEYSET_TO_JSON、KEYSET_FROM_JSON、ROTATE_KEYSET3、KMS 封装 Keyset 管理类使用 KMS 对 Keyset 再加密并支持重新封装、轮转和使用NEW_WRAPPED_KEYSET、REWRAP_KEYSET、ROTATE_WRAPPED_KEYSET、USE_WRAPPED_KEYSET4、增强加解密类使用基础 Keyset 或封装 Keyset 对业务数据加密、解密ENHANCED_SYM_ENCRYPT、ENHANCED_SYM_DECRYPT2、全部函数分类函数功能1、单一密钥加解密类SYM_ENCRYPT对指定列做随机性加密返回BINARY密文1、单一密钥加解密类SYM_DECRYPT对已随机加密的数据解密返回BINARY明文2、基础 Keyset 管理类NEW_KEYSET按指定算法创建新的 Keyset2、基础 Keyset 管理类ADD_KEY_TO_KEYSET向已有 Keyset 添加密钥并设置为主密钥2、基础 Keyset 管理类KEYSET_TO_JSON将BINARYKeyset 转成可读 JSON2、基础 Keyset 管理类KEYSET_FROM_JSON将 JSON Keyset 转回BINARY2、基础 Keyset 管理类ROTATE_KEYSET自动生成新密钥并将其设置为主密钥3、KMS 封装 Keyset 管理类NEW_WRAPPED_KEYSET使用 KMS 创建封装 Keyset3、KMS 封装 Keyset 管理类REWRAP_KEYSET使用新的 KMS 密钥重新封装 Keyset3、KMS 封装 Keyset 管理类ROTATE_WRAPPED_KEYSET重新封装 Keyset同时支持更新数据密钥算法3、KMS 封装 Keyset 管理类USE_WRAPPED_KEYSET将封装 Keyset 转换为可供加解密函数使用的基础 Keyset4、增强加解密类ENHANCED_SYM_ENCRYPT使用指定 Keyset 加密数据4、增强加解密类ENHANCED_SYM_DECRYPT使用与加密时一致的 Keyset 解密数据二、加密能力基础模式密钥管理方式适用场景单一密钥用户自行保存一个密钥简单字段随机加密基础 Keyset一个 Keyset 中可维护多个数据密钥需要密钥轮转KMS 封装 KeysetKMS 密钥再次加密 Keyset对密钥安全要求更高1、定义MaxCompute 的加密能力可以分成三层单一密钥直接传入一个BINARY密钥。基础 Keyset由 MaxCompute 管理一组数据密钥。KMS 封装 Keyset再使用 KMS 对 Keyset 进行封装保护。2、区别对比区别单一密钥 vs Keyset一个密钥 vs 一组可轮转密钥基础 Keyset vs 封装 KeysetKeyset 本身直接保存 vs 再由 KMS 密钥保护SYM_*vsENHANCED_SYM_*直接传单一密钥 vs 使用 KeysetAES-GCM-256随机性加密相同明文多次加密结果可以不同AES-SIV-CMAC-*Keyset 支持的另一类密钥算法3、简单记忆简单字段加密SYM_ENCRYPT / SYM_DECRYPT。多密钥管理Keyset。更安全的 Keyset 管理KMS Wrapped Keyset。Keyset 加解密业务数据ENHANCED_SYM_*。4、案例-- 使用扩展数据类型前开启 MaxCompute 2.0 数据类型SETodps.sql.type.system.odps2true;三、单一密钥加解密类函数功能SYM_ENCRYPT对指定列做随机性加密返回BINARY密文SYM_DECRYPT对已随机加密的数据解密返回BINARY明文1、定义SYM_ENCRYPT使用一个BINARY密钥对STRING或BINARY明文进行随机性加密。SYM_DECRYPT使用相同密钥和相同加密模式解密BINARY密文。当前支持的加密模式包括AES-GCM-256密钥长度为 256 bits。2、区别对比区别SYM_ENCRYPT明文 → 密文SYM_DECRYPT密文 → 明文输入加密支持STRING / BINARY解密输入为BINARY输出两者都返回BINARYAAD加密时用了 AAD解密时必须使用相同 AAD随机性加密的特点相同明文、相同密钥多次加密得到的密文也可能不同。3、简单记忆ENCRYPT 加密。DECRYPT 解密。密钥和 AAD 要前后一致。4、案例-- 加密结果为 BINARY通常再 BASE64 方便存储SELECTBASE64(SYM_ENCRYPT(0001,CAST(b75585cf321cdcad42451690cdb7bfc4ASBINARY)))ASencrypted_value;-- 解密结果转回 STRINGSELECTCAST(SYM_DECRYPT(UNBASE64(encrypted_value),CAST(b75585cf321cdcad42451690cdb7bfc4ASBINARY))ASSTRING)ASplain_valueFROMsource_table;四、基础 Keyset 管理类函数功能NEW_KEYSET按指定算法创建新的 KeysetADD_KEY_TO_KEYSET向 Keyset 新增密钥KEYSET_TO_JSONKeyset 转 JSONKEYSET_FROM_JSONJSON 转 KeysetROTATE_KEYSET自动生成并切换主密钥1、定义Keyset 是一个可保存多个数据密钥的密钥集合。支持的主要算法类型包括AES-GCM-256AES-SIV-CMAC-128AES-SIV-CMAC-2562、区别函数作用NEW_KEYSET从零创建 KeysetADD_KEY_TO_KEYSET手工加入指定密钥ROTATE_KEYSET系统自动生成新密钥并设为主密钥KEYSET_TO_JSON主要用于查看 Keyset 内容KEYSET_FROM_JSON将 JSON 表示恢复成可用 KeysetADD_KEY_TO_KEYSET与ROTATE_KEYSET前者由用户提供raw_key。后者由系统自动生成新密钥。3、简单记忆NEW 新建。ADD 手工加密钥。ROTATE 自动轮转。TO_JSON 查看。FROM_JSON 恢复。4、案例-- 创建 KeysetSELECTHEX(NEW_KEYSET(AES-GCM-256,user info key))ASkeyset_hex;-- 增加密钥并设为主密钥SELECTHEX(ADD_KEY_TO_KEYSET(UNHEX(keyset_hex),AES-SIV-CMAC-128,UNHEX(b75585cf321cdcad42451690cdb7bfc49c26092f60f854e72d43244c55620a3d),new key))ASnew_keyset_hexFROMkey_table;-- Keyset 转 JSONSELECTKEYSET_TO_JSON(UNHEX(keyset_hex))FROMkey_table;-- JSON 转回 KeysetSELECTHEX(KEYSET_FROM_JSON(json_keyset))FROMkey_table;-- 自动轮转主密钥SELECTHEX(ROTATE_KEYSET(UNHEX(keyset_hex),AES-SIV-CMAC-256,rotate key))FROMkey_table;五、KMS封装Keyset管理类函数功能NEW_WRAPPED_KEYSET创建 KMS 封装 KeysetREWRAP_KEYSET使用新 KMS 密钥重新封装ROTATE_WRAPPED_KEYSET重新封装并轮转数据密钥USE_WRAPPED_KEYSET将封装 Keyset 转为加解密可用形式1、定义KMS 封装 Keyset 的核心思路数据由 Keyset 中的数据密钥加密Keyset 本身再由 KMS 用户主密钥保护。这样无需直接查看或保存原始数据加密密钥。2、区别函数核心作用NEW_WRAPPED_KEYSET第一次创建封装 KeysetREWRAP_KEYSET更换外层 KMS 密钥ROTATE_WRAPPED_KEYSET不仅重新封装还能更新内部数据密钥算法USE_WRAPPED_KEYSET解封装为后续加解密函数可使用的 KeysetREWRAP_KEYSETvsROTATE_WRAPPED_KEYSETREWRAP主要改变外层 KMS 封装。ROTATE_WRAPPED还可以更新数据密钥算法。3、简单记忆NEW_WRAPPED 创建封装密钥集。REWRAP 换外包装。ROTATE_WRAPPED 换包装 轮换里面的密钥。USE_WRAPPED 解开后拿来使用。4、案例-- 创建封装 KeysetSELECTHEX(NEW_WRAPPED_KEYSET(acs:kms:cn-hangzhou:UserId:key/CmkId,acs:ram::UserId:role/kms,AES-GCM-256,user info key))ASwrapped_keyset;-- 使用新 KMS 密钥重新封装SELECTHEX(REWRAP_KEYSET(acs:kms:cn-hangzhou:UserId:key/NewCmkId,acs:ram::UserId:role/kms,UNHEX(wrapped_keyset)))FROMkey_table;-- 重新封装并轮转数据密钥SELECTHEX(ROTATE_WRAPPED_KEYSET(acs:kms:cn-hangzhou:UserId:key/CmkId,acs:ram::UserId:role/kms,UNHEX(wrapped_keyset),AES-GCM-256,rotate key))FROMkey_table;-- 获取可用于加解密的基础 KeysetSELECTUSE_WRAPPED_KEYSET(acs:kms:cn-hangzhou:UserId:key/CmkId,acs:ram::UserId:role/kms,UNHEX(wrapped_keyset))FROMkey_table;六、增强加解密类函数功能ENHANCED_SYM_ENCRYPT使用指定 Keyset 加密数据ENHANCED_SYM_DECRYPT使用与加密时一致的 Keyset 解密数据1、定义增强加解密函数使用 Keyset而不是直接传入单个原始密钥。ENHANCED_SYM_ENCRYPTKeyset 明文 →BINARY密文。ENHANCED_SYM_DECRYPT同一 Keyset 密文 →BINARY明文。Keyset 可以来自NEW_KEYSETUSE_WRAPPED_KEYSET2、区别对比区别SYM_ENCRYPT直接传单一密钥ENHANCED_SYM_ENCRYPT传 KeysetSYM_DECRYPT单一密钥解密ENHANCED_SYM_DECRYPTKeyset 解密基础 Keyset可直接作为参数封装 Keyset通常先通过USE_WRAPPED_KEYSET获取可使用形式3、简单记忆SYM_* 单密钥。ENHANCED_SYM_* Keyset。Wrapped Keyset 先USE再加解密。4、案例-- 使用基础 Keyset 加密SELECTBASE64(ENHANCED_SYM_ENCRYPT(UNHEX(keyset_hex),0001))ASencrypted_valueFROMkey_table;-- 使用基础 Keyset 解密SELECTCAST(ENHANCED_SYM_DECRYPT(UNHEX(keyset_hex),UNBASE64(encrypted_value))ASSTRING)ASplain_valueFROMsource_table;七、最容易混淆的函数对比函数组合最核心区别SYM_ENCRYPTvsENHANCED_SYM_ENCRYPT单一密钥 vs KeysetSYM_DECRYPTvsENHANCED_SYM_DECRYPT单一密钥解密 vs Keyset 解密NEW_KEYSETvsNEW_WRAPPED_KEYSET基础 Keyset vs KMS 封装 KeysetADD_KEY_TO_KEYSETvsROTATE_KEYSET手工加入密钥 vs 系统自动生成并轮转KEYSET_TO_JSONvsKEYSET_FROM_JSONKeyset→JSON vs JSON→KeysetREWRAP_KEYSETvsROTATE_WRAPPED_KEYSET更换 KMS 封装 vs 更换封装并轮转数据密钥NEW_WRAPPED_KEYSETvsUSE_WRAPPED_KEYSET创建封装 Keyset vs 使用封装 KeysetBASE64vsHEX都可把二进制变成可存储字符串但编码方式不同AES-GCM-256vsAES-SIV-CMAC-*不同加密算法类型八、常用案例1、身份证字段加密后存储SELECTid,BASE64(SYM_ENCRYPT(id_card_no,CAST(b75585cf321cdcad42451690cdb7bfc4ASBINARY)))ASid_card_no_encryptFROMuser_info;2、解密后返回STRINGSELECTCAST(SYM_DECRYPT(UNBASE64(id_card_no_encrypt),CAST(b75585cf321cdcad42451690cdb7bfc4ASBINARY))ASSTRING)ASid_card_noFROMuser_info;3、创建KeysetSELECTHEX(NEW_KEYSET(AES-GCM-256,user info))ASkeyset_hex;4、轮转KeysetSELECTHEX(ROTATE_KEYSET(UNHEX(keyset_hex),AES-GCM-256,2026 rotate))FROMkey_table;5、查看Keyset详情SELECTKEYSET_TO_JSON(UNHEX(keyset_hex))FROMkey_table;6、使用Keyset加密SELECTBASE64(ENHANCED_SYM_ENCRYPT(UNHEX(keyset_hex),id_card_no))ASencrypted_valueFROMuser_infoCROSSJOINkey_table;九、使用注意事项1、定义加密函数涉及密钥、BINARY类型、KMS 权限以及数据解密能力需要比普通 SQL 函数更关注安全和权限管理。2、区别主要注意使用BINARY等扩展类型时可先开启SET odps.sql.type.system.odps2true;单一密钥方案中密钥需要用户自行安全保存。密钥丢失后可能导致密文无法恢复。不建议将明文密钥直接写在长期保存或共享的 SQL 中。官方建议可将密钥保存在受控表中并通过权限控制和安全视图隔离密钥。KMS 封装 Keyset 需要提前配置 KMS、RAM 角色及 MaxCompute 访问权限。加密和解密时使用的 Keyset / AAD 必须匹配。3、简单记忆密钥不要散落在 SQL。加密前先规划密钥保存和轮转。解密权限要比查询密文权限更严格。高安全要求优先考虑 KMS 封装 Keyset。4、案例-- 开启 MaxCompute 2.0 类型系统SETodps.sql.type.system.odps2true;十、参考资料阿里云 MaxCompute 官方文档https://help.aliyun.com/zh/maxcompute/encryption-and-decryption-functions