Criptografia e descriptografia de colunas de dados
A criptografia de dados é amplamente utilizada em vários sistemas de informação como uma tecnologia para efetivamente impedir o acesso não autorizado e evitar o vazamento de dados. Como o núcleo do sistema de informação, o armazém de dados de GaussDB(DWS) também fornece funções de criptografia de dados, incluindo encritação transparente e encritação usando funções SQL. Esta seção descreve a encritação de função SQL.
Atualmente, o GaussDB(DWS) não suporta descriptografar dados criptografados em bancos de dados de Oracle, Teradata e MySQL. A criptografia e descriptografia dos bancos de dados de Oracle, Teradata e MySQL são diferentes das do GaussDB(DWS). O GaussDB(DWS) só pode descriptografar dados não criptografados migrados de bancos de dados de Oracle, Teradata e MySQL.
Conhecimento de fundo
- Funções hash
A função hash também é chamada de algoritmo de resumo. Ela mapeia dados de entrada de um comprimento arbitrário para uma saída de comprimento fixo. Por exemplo, Hash(data)=result. Este processo é irreversível. Ou seja, a função hash não tem uma função inversa, e os dados não podem ser obtidos a partir do resultado. Em cenários em que as senhas de texto não criptografado não devem ser armazenadas (senhas são sensíveis) ou conhecidas pelos administradores de sistema, os algoritmos de hash devem ser usados para armazenar valores de hash unidirecional de senhas.
Em uso real, os valores de sal e iteração são adicionados para evitar os mesmos valores de hash gerados pelas mesmas senhas, portanto, para evitar ataques à tabela arco-íris.
Figura 1 Funções hash
- Algoritmos de criptografia simétrica
Algoritmos de criptografia simétrica usam a mesma chave para criptografar e descriptografar dados. Existem duas subcategorias de algoritmos de criptografia simétrica: cifras de bloco e cifras de fluxo.
As cifras de bloco quebram o texto não criptografado em grupos de bits de comprimento fixo conhecidos como blocos e cada bloco é criptografado como uma unidade. E se não houver dados suficientes para preencher completamente um bloco, o "padding" é usado para garantir que os blocos atendam aos requisitos de comprimento fixo. Devido ao preenchimento, o comprimento do texto cifrado obtido por cifras de bloco é maior do que o do texto não criptografado.
Em cifras de fluxo, as partes de criptografia e descriptografia usam o mesmo fluxo de dados criptografado pseudo-aleatório como chaves, e os dados de texto simples são criptografados sequencialmente por essas chaves. Na prática, os dados são criptografados um bit de cada vez usando uma operação XOR. As cifras de fluxo não precisam ser acolchoadas. Portanto, o comprimento do texto cifrado obtido é o mesmo que o comprimento do texto simples.
Figura 2 Algoritmos de criptografia simétrica
Detalhes técnicos
GaussDB(DWS) fornece funções hash e algoritmos criptográficos simétricos para criptografar e descriptografar colunas de dados. As funções hash suportam sha256, sha384, sha512 e SM3. Os algoritmos criptográficos simétricos suportam AES128, AES192, AES256 e SM4.
- Funções hash
- Algoritmos de criptografia simétrica
- gs_encrypt(encryptstr, keystr, cryptotype, cryptomode, hashmethod)
Criptografa uma cadeia encryptstr usando a chave keystr com base no algoritmo de criptografia especificado por cryptotype e cryptomode e o algoritmo HMAC especificado por hashmethod, e retorna a cadeia criptografada.
- gs_decrypt(decryptstr, keystr, cryptotype, cryptomode, hashmethod)
Descriptografa uma cadeia decryptstr usando a chave keystr com base no algoritmo de criptografia especificado por cryptotype e cryptomode e o algoritmo HMAC especificado por hashmethod, e retorna a cadeia descriptografada. O keystr usado para descriptografia deve ser consistente com o usado para criptografia.
- gs_encrypt_aes128(encryptstr,keystr)
Criptografa cadeias encryptstr usando keystr como chave e retorna cadeias criptografadas. O comprimento do keystr varia de 1 a 16 bytes.
- gs_decrypt_aes128(decryptstr,keystr)
Descriptografa uma cadeia decryptstr usando a chave keystr e retorna a cadeia descriptografada. O keystr usado para descriptografia deve ser consistente com o usado para criptografia. keystr não pode estar vazio.
Para obter mais informações sobre funções, consulte Uso de funções para criptografia e descriptografia.
- gs_encrypt(encryptstr, keystr, cryptotype, cryptomode, hashmethod)
Exemplos
- Conecte-se ao banco de dados.
Para obter detalhes, consulte Uso do cliente da CLI gsql para conectar-se a um cluster.
- Crie a tabela student com os atributos id, name e score. Em seguida, use funções hash para criptografar e salvar nomes e use algoritmos criptográficos simétricos para salvar pontuações.
1 2 3 4
CREATE TABLE student (id int, name text, score text, subject text); INSERT INTO student VALUES (1, gs_hash('alice', 'sha256'), gs_encrypt('95', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('math', '1234')); INSERT INTO student VALUES (2, gs_hash('bob', 'sha256'), gs_encrypt('92', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('english', '1234')); INSERT INTO student VALUES (3, gs_hash('peter', 'sha256'), gs_encrypt('98', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('science', '1234'));
- Consulte a tabela student sem usar chaves. O resultado da consulta mostra que os dados criptografados nas colunas nome e pontuação não podem ser visualizados mesmo que você tenha a permissão SELECT.
1 2 3 4 5 6 7 8 9 10 11 12
select * from student; id | name | score | subject ----+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------- ----------------------------------------------------------------------------------- 1 | 2bd806c97f0e00af1a1fc3328fa763a9269723c8db8fac4f93af71db186d6e90 | AAAAAAAAAABAuUC3VQ+MvPCDAaTUySl1e2gGLr4/ATdCUjTEvova3cb/Ba3ZKqIn1yNVGEFBvJnTq/3sLF4//Gm8qG7AyfNbbqdW3aYErLVpbE/QWFX9Ig== | aFEWQR2gkj iu6sfsAad+dHzfFDHePZ6xd44zyekh+qVFlh9FODZ0DoaFAJXctwUsiqaiitTxW8cCSEaNjS/E7Ke1ruY= 2 | 81b637d8fcd2c6da6359e6963113a1170de795e4b725b84d1e0b4cfd9ec58ce9 | AAAAAAAAAABAuUC3VQ+MvPCDAaTUySl1taXxAoDqE793hgyCJvC0ESdAX5Mtgdq2LXI1f5ZxraQ73WIJVtIBX8oe3gTDxoXGlHbHht4kzM4U8dOwr5rjgg== | aFEWQR2gkj iu6sfsAad+dM8tPTDo/Pds6ZmqdmjGiKxf39+Wzx5NoQ6c8FrzihnRzgc0fycWSu5YGWNOKYWhRsE84Ac= 3 | 026ad9b14a7453b7488daa0c6acbc258b1506f52c441c7c465474c1a564394ff | AAAAAAAAAACnyusORPeApqMUgh56ucQu3uso/Llw5MbPFMkOXuspEzhhnc9vErwOFe6cuGtx8muEyHCX7V5yXs+8FxhNh3n5L3419LDWJJLY2O4merHpSg== | zomphRfHV4 H32hTtgkio1PyrobVO8N+hN7kAKwtygKP2E7Aaf1vsjmtLHcL88jyeJNe1lxe0fAvodzPJAxAuV3UJN4M= (3 rows)
- Consulte a tabela student usando chaves. O resultado da consulta mostra que os dados são descriptografados pela função gs_decrypt (correspondente a gs_encrypt) e podem ser visualizados.
1 2 3 4 5 6 7
select id, gs_decrypt(score, '12345', 'aes128', 'cbc', 'sha256'),gs_decrypt_aes128(subject, '1234') from student; id | gs_decrypt | gs_decrypt_aes128 ----+------------+------------------- 1 | 95 | math 2 | 92 | english 3 | 98 | science (3 rows)