Um keyset no MaxCompute gerencia uma ou mais chaves criptográficas. Você pode adicionar chaves a um keyset para realizar a rotação de chaves e inspecionar o material original da chave.
Observações
Armazene seus keysets e parâmetros de descriptografia com segurança. Em caso de perda, os dados criptografados com o keyset serão irrecuperáveis permanentemente.
Preparar dados
Crie uma tabela chamada mf_test_data e adicione dados de exemplo a ela.
-- Create a table.
create table mf_test_data(id string,name string,tel string);
-- Insert data.
insert into mf_test_data values(1,'kyle','13900001234'),(2,'tom','13900001111');
-- Query the data.
select * from mf_test_data;
-- The following result is returned:
+----+------+-----+
| id | name | tel |
+----+------+-----+
| 1 | kyle | 13900001234 |
| 2 | tom | 13900001111 |
+----+------+-----+
Usar keysets padrão
-
Exemplo 1: Criar um novo keyset.
select NEW_KEYSET('AES-GCM-256', 'my first keyset');O resultado é o seguinte.
+------+ | _c0 | +------+ | =0A=10260nZQEAMAsSF7mB=12\=0A3=0A=0BAES-GCM-256=12=20=C4t=13+=8E=DD=9D=E8=A0=AA=B4=ED~1`=B7=C6=D0K=D3=FC=D4n=DF=DF=D4=C3)=E8=96=0E=17=18=01=20=02=10=01=1A=10260nZQEAMAsSF7mB=20=02*=0Fmy=20first=20keyset | +------+ -
Exemplo 2: Visualizar a representação JSON em texto simples de um keyset.
select KEYSET_TO_JSON(NEW_KEYSET('AES-GCM-256', 'my first keyset'));O resultado é o seguinte.
+-----+ | _c0 | +-----+ | { "key": [{ "description": "my first keyset", "key_id": "Ra4nZQEAoBuiGbmB", "key_meta_data": { "key_material_origin": "Origin_ALIYUN_MAXCOMPUTE", "key_material_type": "SYMMETRIC", "type": "AES-GCM-256", "value": "/LFKWhw18hz+OBO490YKmjQQDNVWJLOueaUAKKiem/k="}, "output_prefix_type": "PREFIX_ALIYUN_MAXCOMPUTE", "status": "ENABLED"}], "primary_key_id": "Ra4nZQEAoBuiGbmB"} | -
Exemplo 3: Adicionar uma nova chave ao keyset e defini-la como chave primária.
-
Adicione uma chave
AES-SIV-CMAC-128a um keyset existente que contém uma chaveAES-GCM-256.select KEYSET_TO_JSON( ADD_KEY_TO_KEYSET( NEW_KEYSET('AES-GCM-256', 'my first keyset'), 'AES-SIV-CMAC-128', unhex('b75585cf321cdcad42451690cdb7bfc49c26092f60f854e72d43244c55620a3d'), '' ) );O resultado é o seguinte.
+-----+ | _c0 | +-----+ | { "key": [{ "description": "my first keyset", "key_id": "+q8nZQEAgAMtJLmB", "key_meta_data": { "key_material_origin": "Origin_ALIYUN_MAXCOMPUTE", "key_material_type": "SYMMETRIC", "type": "AES-GCM-256", "value": "Hj//ZKxLE/t0Uq7XRJQoe2OYNwlauDdGmkaQbMfnZ80="}, "output_prefix_type": "PREFIX_ALIYUN_MAXCOMPUTE", "status": "ENABLED"}, { "description": "", "key_id": "+q8nZQEAML2VArmB", "key_meta_data": { "key_material_origin": "Origin_RAW", "key_material_type": "SYMMETRIC", "type": "AES-SIV-CMAC-128", "value": "t1WFzzIc3K1CRRaQzbe/xJwmCS9g+FTnLUMkTFViCj0="}, "output_prefix_type": "PREFIX_ALIYUN_MAXCOMPUTE", "status": "ENABLED"}], "primary_key_id": "+q8nZQEAML2VArmB"} | +-----+ -
Esta função gera automaticamente uma nova chave e a define como chave primária.
select KEYSET_TO_JSON( ROTATE_KEYSET( NEW_KEYSET('AES-GCM-256', 'my first keyset'), 'AES-GCM-256') );O resultado é o seguinte.
+-----+ | _c0 | +-----+ | { "key": [{ "description": "my first keyset", "key_id": "TbEnZQEAUIEJC7mB", "key_meta_data": { "key_material_origin": "Origin_ALIYUN_MAXCOMPUTE", "key_material_type": "SYMMETRIC", "type": "AES-GCM-256", "value": "TLAKX8y0/aUbMAtElI+oicEw1fWSTJhZs1D2i3AAf40="}, "output_prefix_type": "PREFIX_ALIYUN_MAXCOMPUTE", "status": "ENABLED"}, { "key_id": "TbEnZQEAAIy0IrmB", "key_meta_data": { "key_material_origin": "Origin_ALIYUN_MAXCOMPUTE", "key_material_type": "SYMMETRIC", "type": "AES-GCM-256", "value": "jPewQsmbsajzM/gLNX9QFtENs2n9uvhgrgcrcGgl0A0="}, "output_prefix_type": "PREFIX_ALIYUN_MAXCOMPUTE", "status": "ENABLED"}], "primary_key_id": "TbEnZQEAAIy0IrmB"} | +-----+
-
-
Exemplo 4: Criptografar e descriptografar dados.
-
Crie uma tabela chamada
mf_keysete grave o keyset nela.-- Create a table. create table mf_keyset (id string,ks binary); -- Create a keyset and insert it into the mf_keyset table. insert into mf_keyset select '1',NEW_KEYSET('AES-GCM-256', 'my first keyset'); -
Criptografe e descriptografe a coluna tel na tabela
mf_test_data.-
Criptografe a coluna tel na tabela
mf_test_data.select id, name, ENHANCED_SYM_ENCRYPT(ks,tel) as tel from (SELECT id,name,tel FROM mf_test_data) JOIN (SELECT ks FROM mf_keyset WHERE id = '1') a ;O resultado é o seguinte.
+----+------+------+ | id | name | tel | +----+------+------+ | 1 | kyle | =0B=88=A5=0Ak=AD=E0=9A=B4=EC=CC=1F=F9=DEk\=16=0F=BD=F1=03=8B=95=F0@=88s=EE=1E=8A=D2=05=83=B5'e=01=00=A0=C5=0BXu=A5Z&<=01=F8=C5Q=89=A9=A6=80=E2=0F=1A)=02fa=CF=07'=1B'=EB=FD=CF=E9 | | 2 | tom | =0B=88=A5=0Ak=AD=E0=9A=B4=EC=CC=1F=F9=DEk\=16=0F=BD=F1=03=8B=95=F0@=88s=EE=1E=8A=D2=05=83=B5'e=01=00=10=FC=0BXu=A5+3=D5=1Fb=C0=88=AC=90=AA=FE!C=F0=99y&=9C=89=0E=9B=8FD=16=E0=96, | +----+------+------+ -
Descriptografe a coluna tel na tabela
mf_test_data.select id, name, ENHANCED_SYM_DECRYPT(ks, ENHANCED_SYM_ENCRYPT(ks,tel), '')as tel from (SELECT id,name,tel FROM mf_test_data) JOIN (SELECT ks FROM mf_keyset WHERE id = '1') a ;O resultado é o seguinte.
+----+------+------+ | id | name | tel | +----+------+------+ | 1 | kyle | 13900001234 | | 2 | tom | 13900001111 | +----+------+------+
-
-
Usar keysets com KMS
O MaxCompute integra-se ao Key Management Service (KMS) para aprimorar a criptografia de dados. Primeiro, gera-se um keyset padrão para criptografar e descriptografar dados; em seguida, esse keyset é criptografado por uma chave do KMS para criar um keyset encapsulado que você deve salvar. Ao criptografar ou descriptografar dados, forneça o keyset encapsulado, e o MaxCompute usará a chave do KMS para desencapsulá-lo e restaurar temporariamente o keyset original para a operação.
O diagrama a seguir ilustra esse fluxo de trabalho.

Ativar o KMS e configurar permissões
Ative o KMS e adquira uma instância de gerenciamento de chaves de software. Para obter mais informações, consulte Purchase and enable a KMS instance.
-
Crie uma chave e obtenha seu ARN na página Key Details. Para obter mais informações, consulte Getting started with Key Management.
Neste exemplo, o ARN da chave criada é
acs:kms:cn-beijing:189273228874****:key/key-bjj6527b6c6465hsf****. -
Conceda ao MaxCompute as permissões necessárias do KMS para criptografia e descriptografia.
NotaApós encapsular um keyset do MaxCompute com o KMS, conceda ao MaxCompute as permissões necessárias do KMS. Caso contrário, os comandos subsequentes de criptografia e descriptografia falharão.
Siga estas etapas:
Crie uma função do RAM. Defina o trusted entity type como Alibaba Cloud Service e o Trusted Service como MaxCompute. Para obter mais informações, consulte Create a RAM role for a trusted Alibaba Cloud service.
-
Anexe a política de sistema AliyunKMSCryptoUserAccess à função criada para conceder ao MaxCompute as permissões necessárias para criptografia e descriptografia. Para obter mais informações, consulte Grant permissions to a RAM role.
Se uma conta Alibaba Cloud chamada USER_A executar essas etapas, ela poderá então criptografar o keyset.
Para este exemplo, a função do RAM chama-se
mf-secr, e seu ARN éacs:ram::189273228874****:role/mf-secr.
-
(Opcional) Para permitir que um usuário do RAM da mesma conta (USER_A) ou de outra conta (USER_B) realize criptografia e descriptografia, conceda as seguintes permissões.
Usando um usuário do RAM de USER_A
Para permitir que o usuário do RAM use a função
mf-secr, crie uma política que conceda a permissãoram:PassRolena funçãomf-secre anexe-a ao usuário do RAM. Para obter mais informações, consulte Grant permissions to a RAM user. O código de exemplo a seguir fornece um modelo de política.{ "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram:*:*:role/mf-secr" } ], "Version": "1" }Usando USER_B e seus usuários do RAM
ImportantePara criptografia e descriptografia entre contas, especifique o parâmetro
role_chainnas funções relevantes. Com base nas funções do exemplo a seguir, o parâmetro seria'acs:ram::188538605451****:role/b-secr,acs:ram::189273228874****:role/mf-secr2b'.Siga estas etapas:
Na conta Alibaba Cloud USER_A, crie uma nova função do RAM (por exemplo,
mf-secr2b). Defina o trusted entity type como Alibaba Cloud Account e especifique USER_B como a conta confiável. Para obter mais informações, consulte Create a RAM role for a trusted Alibaba Cloud account.Conceda à função
mf-secr2ba permissãoram:PassRolena funçãomf-secr. Para ver um exemplo de política, consulte Use a RAM user of USER_A to perform encryption and decryption.Na conta Alibaba Cloud USER_B, crie uma nova função do RAM (por exemplo,
b-secr). Defina o trusted entity type como Alibaba Cloud Service e o Trusted Service como MaxCompute. Para obter mais informações, consulte Create a RAM role for a trusted Alibaba Cloud service.-
Conceda à função
b-secra permissãosts:AssumeRolena funçãomf-secr2b. O código de exemplo a seguir fornece um modelo de política.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "acs:ram:*:189273228874****:role/mf-secr2b" } ] } -
(Opcional) Se um usuário do RAM de USER_B precisar realizar criptografia e descriptografia, conceda também a esse usuário a permissão
ram:PassRolena funçãob-secr. O código de exemplo a seguir fornece um modelo de política.{ "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram:*:*:role/b-secr" } ], "Version": "1"
Criptografar e descriptografar dados com o KMS
-
Exemplo 1: Criar um novo keyset encapsulado.
select hex(NEW_WRAPPED_KEYSET('acs:kms:cn-beijing:189273228874****:key/key-bjj6527b6c6465hsf****', 'acs:ram::189273228874****:role/mf-secr', 'AES-GCM-256', 'hello'));O resultado é o seguinte.
+-----+ | _c0 | +-----+ | 613256354C574A71616A59314D6A64694E6D4D324E44593161484E6D65576732595331315A586435646D4678596A6C36555437693738632B647070524B46334E5263497567384A6B36716C4E54354133734F6E4776376258453132524E6C4B6E5163703859787132536C6D794F6E4A6975797541745448374F6B5132412B4B6947502F4A7530756477694B736B503033576643726E45646D666F6F324D61774F7A452F4F55314A51643268397941384F6B425644665A59746D3968775576536E543744684276723773464A714A47394D7770765064484B6A457A6F4A3533716E57766F4339634639413348556E433641434A6438444170583275326B2B4177776941487668575279304941445031373461794A2F50773D3D | +-----+ -
Exemplo 2: Criptografar novamente um keyset encapsulado.
select REWRAP_KEYSET('acs:kms:cn-beijing:189273228874****:key/key-bjj6527b6c6465hsf****', 'acs:ram::189273228874****:role/mf-secr', unhex('613256354C574A71616A59314D6A64694E6D4D324E44593161484E6D65576732595331315A586435646D4678596A6C36555437693738632B647070524B46334E5263497567384A6B36716C4E54354133734F6E4776376258453132524E6C4B6E5163703859787132536C6D794F6E4A6975797541745448374F6B5132412B4B6947502F4A7530756477694B736B503033576643726E45646D666F6F324D61774F7A452F4F55314A51643268397941384F6B425644665A59746D3968775576536E543744684276723773464A714A47394D7770765064484B6A457A6F4A3533716E57766F4339634639413348556E433641434A6438444170583275326B2B4177776941487668575279304941445031373461794A2F50773D3D'));O resultado é o seguinte.
+------+ | _c0 | +------+ | a2V5LWJqajY1MjdiNmM2NDY1aHNmeWg2YS11ZXd5dmFxYjl60Kftgx5o1sQH4kkwRboFSYUmcVKjF1GKF+JU5gKSp3xOF1xjKdb6fGZyNuD4YSAzqNTD7x7j5fzTLW2+9a+8BmS1z3ZP1RjNL6Lp93FAC4NWg/jtggh6WOTXrVoG67/CfzdWro65YDTPZpe52K416gpfW18GXSOzu9q4swMti0UrScl/fTg6eOIMYgoPCfBh9qvXhNSR72J+qXU1vHcyYNQL6UewsBE2suVRFQ=3D=3D | -
Exemplo 3: Realizar rotação de chaves.
select ROTATE_WRAPPED_KEYSET('acs:kms:cn-beijing:189273228874****:key/key-bjj6527b6c6465hsf****', 'acs:ram::189273228874****:role/mf-secr', unhex('613256354C574A71616A59314D6A64694E6D4D324E44593161484E6D65576732595331315A586435646D4678596A6C36555437693738632B647070524B46334E5263497567384A6B36716C4E54354133734F6E4776376258453132524E6C4B6E5163703859787132536C6D794F6E4A6975797541745448374F6B5132412B4B6947502F4A7530756477694B736B503033576643726E45646D666F6F324D61774F7A452F4F55314A51643268397941384F6B425644665A59746D3968775576536E543744684276723773464A714A47394D7770765064484B6A457A6F4A3533716E57766F4339634639413348556E433641434A6438444170583275326B2B4177776941487668575279304941445031373461794A2F50773D3D'), 'AES-GCM-256', 'descrption');O resultado é o seguinte.
+------+ | _c0 | +------+ | a2V5LWJqajY1MjdiNmM2NDY1aHNmeWg2YS11ZXd5dmFxYjl67ZxGgfbQhsOududp3FuxLFW1qWt7fF2fT2mAqFekH3D/SoooVf1Jgj0dS/3kxHLQImthef+fCca5vRbVYbOeSsjhGI841WhJvYE1KzRuTpV04SpzVimCovlPPiYCm1649Vhkua1/zUu2W0ioCPnXzHIANhoOIXM2mAV+EfuRCjLUtcJhMdCnu+whHwkGXMYugtXmLxZIBHaJNvO9I3tntplTzxElVmj/LpDrAkg0mKahLJa7FhcJ8cn/JHjp9sk0MhHQc/5X14vHBJuulkYkukcF/kZ+AFVfWes5pZOMs8Og3pYEjCESMiiMONy/CpIrYepapgsKqRAmCGxRv/7aDOZyaAV5Jdz31NotMCBi/hrYBwyU0QdAq5pvsOEdXVIJyazViQ=3D=3D | +------+ -
Exemplo 4: Criptografar e descriptografar dados.
-
Crie uma tabela chamada
mf_keyset_kmse grave o keyset encapsulado nela.-- Create a table. create table mf_keyset_kms (id string,ks binary); -- Generate a wrapped keyset and write it to the table. insert into mf_keyset_kms select '1', NEW_WRAPPED_KEYSET( 'acs:kms:cn-beijing:189273228874****:key/key-bjj6527b6c6465hsf****', 'acs:ram::189273228874****:role/mf-secr', 'AES-GCM-256', 'description');Verifique se o keyset foi gravado.
-- Query the table. select id,hex(ks) from mf_keyset_kms; -- The following result is returned: +----+------+ | id | ks | +----+------+ | 1 | 613256354C574A71616A59314D6A64694E6D4D324E44593161484E6D65576732595331315A586435646D4678596A6C36555437693738632B647070524B46334E5263497567384A6B36716C4E54354133734F6E4776376258453132524E6C4B6E5163703859787132536C6D794F6E4A6975797541745448374F6B5132412B4B6947502F4A7530756477694B736B503033576643726E45646D666F6F324D61774F7A452F4F55314A51643268397941384F6B425644665A59746D3968775576536E543744684276723773464A714A47394D7770765064484B6A457A6F4A3533716E57766F4339634639413348556E433641434A6438444170583275326B2B4177776941487668575279304941445031373461794A2F50773D3D | -
Criptografe e descriptografe a coluna tel na tabela
mf_test_data.-
Criptografe a coluna tel na tabela
mf_test_data.-- Encrypt the tel column. The keyset must be provided as a constant. select id, name, ENHANCED_SYM_ENCRYPT( USE_WRAPPED_KEYSET('acs:kms:cn-beijing:189273228874****:key/key-bjj6527b6c6465hsf****', 'acs:ram::189273228874****:role/mf-secr', unhex('613256354C574A71616A59314D6A64694E6D4D324E44593161484E6D65576732595331315A586435646D4678596A6C36555437693738632B647070524B46334E5263497567384A6B36716C4E54354133734F6E4776376258453132524E6C4B6E5163703859787132536C6D794F6E4A6975797541745448374F6B5132412B4B6947502F4A7530756477694B736B503033576643726E45646D666F6F324D61774F7A452F4F55314A51643268397941384F6B425644665A59746D3968775576536E543744684276723773464A714A47394D7770765064484B6A457A6F4A3533716E57766F4339634639413348556E433641434A6438444170583275326B2B4177776941487668575279304941445031373461794A2F50773D3D') ), tel ) as tel FROM mf_test_data;O resultado é o seguinte.
+----+------+------+ | id | name | tel | +----+------+------+ | 1 | kyle | =1A=B88=F7=C5A=DF=DC=91=A6R=F8{=EB=A5_x=AD=AF=FF=9A=14=D81<=8BO=EB=F5=D3Jn=E8=0ESe=01=00=A0=AC=0D=C8=0De=B9=E4=84=AB=F0f=AE~Dt=C5W=FAx=A5=11=01t=95=DF=FA/-=BC7=C5G | | 2 | tom | =1A=B88=F7=C5A=DF=DC=91=A6R=F8{=EB=A5_x=AD=AF=FF=9A=14=D81<=8BO=EB=F5=D3Jn=E8=0ESe=01=00=B0=BF=0D=C8=0DejL{;.w0=80,=E6=86V@b=F3=AB=DEY=A6=02=07=001=E0[=E7V | +----+------+------+ -
Descriptografe a coluna tel na tabela
mf_test_data.select id, name, ENHANCED_SYM_DECRYPT( USE_WRAPPED_KEYSET('acs:kms:cn-beijing:189273228874****:key/key-bjj6527b6c6465hsf****', 'acs:ram::189273228874****:role/mf-secr', unhex('613256354C574A71616A59314D6A64694E6D4D324E44593161484E6D65576732595331315A586435646D4678596A6C36555437693738632B647070524B46334E5263497567384A6B36716C4E54354133734F6E4776376258453132524E6C4B6E5163703859787132536C6D794F6E4A6975797541745448374F6B5132412B4B6947502F4A7530756477694B736B503033576643726E45646D666F6F324D61774F7A452F4F55314A51643268397941384F6B425644665A59746D3968775576536E543744684276723773464A714A47394D7770765064484B6A457A6F4A3533716E57766F4339634639413348556E433641434A6438444170583275326B2B4177776941487668575279304941445031373461794A2F50773D3D') ), ENHANCED_SYM_ENCRYPT( USE_WRAPPED_KEYSET('acs:kms:cn-beijing:189273228874****:key/key-bjj6527b6c6465hsf****', 'acs:ram::189273228874****:role/mf-secr', unhex('613256354C574A71616A59314D6A64694E6D4D324E44593161484E6D65576732595331315A586435646D4678596A6C36555437693738632B647070524B46334E5263497567384A6B36716C4E54354133734F6E4776376258453132524E6C4B6E5163703859787132536C6D794F6E4A6975797541745448374F6B5132412B4B6947502F4A7530756477694B736B503033576643726E45646D666F6F324D61774F7A452F4F55314A51643268397941384F6B425644665A59746D3968775576536E543744684276723773464A714A47394D7770765064484B6A457A6F4A3533716E57766F4339634639413348556E433641434A6438444170583275326B2B4177776941487668575279304941445031373461794A2F50773D3D') ), tel ), '' ) as tel FROM mf_test_data;O resultado é o seguinte.
+----+------+------+ | id | name | tel | +----+------+------+ | 1 | kyle | 13900001234 | | 2 | tom | 13900001111 | +----+------+------+
-
-