Escrito por

Sales Engineer at InterSystems
Artigo Danusa Calixto · Jul. 11, 2022 10m read

Dominando a classe %SYSTEM.Encryption


O InterSystems IRIS tem um suporte excelente para operações de criptografia, descriptografia e hashing. Na classe %SYSTEM.Encryption (https://docs.intersystems.com/iris20212/csp/documatic/%25CSP.Documatic.cls?LIBRARY=%25SYS&PRIVATE=1&CLASSNAME=%25SYSTEM.Encryption), há métodos de classes para os principais algoritmos no mercado.

Algoritmos IRIS e tipos de criptografia/descriptografia

Como você pode ver, as operações são baseadas em chaves e incluem 3 opções:

  • Chaves simétricas: as partes que executam as operações de criptografia e descriptografia compartilham a mesma chave secreta.
  • Chaves assimétricas: as partes que conduzem as operações de criptografia e descriptografia compartilham a mesma chave secreta para a criptografia. No entanto, para a descriptografia, cada parceiro tem uma chave privada. Essa chave não pode ser compartilhada com outras pessoas, pois é uma prova de identidade.
  • Hash: é usado quando você só precisa criptografar, e não descriptografar. É uma abordagem comum para o armazenamento das senhas dos usuários.

Diferenças entre a criptografia simétrica e assimétrica

  • A criptografia simétrica usa uma única chave, compartilhada entre as pessoas que precisam receber a mensagem, enquanto a criptografia assimétrica usa um par de chaves públicas e uma chave privada para criptografar e descriptografar as mensagens durante a comunicação.
  • A criptografia simétrica é uma técnica antiga, enquanto a criptografia assimétrica é relativamente nova.
  • A criptografia assimétrica foi criada para complementar o problema inerente da necessidade de compartilhar a chave em um modelo de criptografia simétrica, sem precisar compartilhar a chave usando um par de chaves pública-privada.
  • A criptografia assimétrica leva mais tempo do que a criptografia simétrica.
< width="172">
  <th>
    Criptografia simétrica
  </th>
  
  <th>
    Criptografia assimétrica
  </th>
</tr>

<tr>
  <td>
    Tamanho do texto cifrado
  </td>
  
  <td>
    Texto cifrado menor do que o arquivo de texto simples original.
  </td>
  
  <td>
    Texto cifrado maior do que o arquivo de texto simples original.
  </td>
</tr>

<tr>
  <td>
    Tamanho dos dados
  </td>
  
  <td>
    Usada para transmitir dados grandes.
  </td>
  
  <td>
    Usada para transmitir dados pequenos.
  </td>
</tr>

<tr>
  <td>
    Uso de recursos
  </td>
  
  <td>
    A criptografia simétrica de chaves funciona com baixo uso de recursos.
  </td>
  
  <td>
    A criptografia assimétrica requer alto consumo de recursos.
  </td>
</tr>

<tr>
  <td>
    Comprimento da chave
  </td>
  
  <td>
    Tamanho de 128 ou 256-bit.
  </td>
  
  <td>
    Tamanho de RSA 2048-bit ou superior.
  </td>
</tr>

<tr>
  <td>
    Segurança
  </td>
  
  <td>
    Menos segura devido ao uso de uma única chave para criptografia.
  </td>
  
  <td>
    Muito mais segura já que duas chaves diferentes estão envolvidas na criptografia e descriptografia.
  </td>
</tr>

<tr>
  <td>
    Número de chaves
  </td>
  
  <td>
    A criptografia simétrica usa uma única chave para a criptografia e descriptografia.
  </td>
  
  <td>
    A criptografia assimétrica usa duas chaves diferentes para a criptografia e descriptografia
  </td>
</tr>

<tr>
  <td>
    Técnicas
  </td>
  
  <td>
    É uma técnica antiga.
  </td>
  
  <td>
    É uma técnica moderna.
  </td>
</tr>

<tr>
  <td>
    Confidencialidade
  </td>
  
  <td>
    Uma única chave para a criptografia e descriptografia tem o risco de ser comprometida.
  </td>
  
  <td>
    Duas chaves são criadas separadamente para a criptografia e descriptografia, o que elimina a necessidade de compartilhar uma chave.
  </td>
</tr>

<tr>
  <td>
    Velocidade
  </td>
  
  <td>
    A criptografia simétrica é uma técnica rápida.
  </td>
  
  <td>
    A criptografia assimétrica é mais lenta em termos de velocidade.
  </td>
</tr>

<tr>
  <td>
    Algoritmos
  </td>
  
  <td>
    RC4, AES, DES, 3DES e QUAD.
  </td>
  
  <td>
    RSA, Diffie-Hellman e ECC.
  </td>
</tr>
Principais diferenças

Fonte: https://www.ssl2buy.com/wiki/symmetric-vs-asymmetric-encryption-what-are-differences 

Usando a classe %SYSTEM.Encryption para criptografia, descriptografia e hash

Para treinar o suporte do IRIS para as operações de criptografia, descriptografia e hash, acesse https://github.com/yurimarx/cryptography-sample e siga estas etapas:

  1. Use o git pull ou clone o repositório em qualquer diretório local
$ git clone https://github.com/yurimarx/cryptography-samples.git
  1. Abra um terminal Docker nesse diretório e execute:
$ docker-compose build
  1. Execute o contêiner IRIS:
$ docker-compose up -d
  1. Abra o terminal IRIS:
$ docker-compose exec iris iris session iris -U IRISAPP

IRISAPP>
  1. Para a criptografia assimétrica com RSA, execute:
IRISAPP>Set ciphertext = ##class(dc.cryptosamples.Samples).DoRSAEncrypt("InterSystems")
IRISAPP>Write ciphertext
Ms/eR7pPmE39KBJu75EOYIxpFEd7qqoji61EfahJE1r9mGZX1NYuw5i2cPS5YwE3Aw6vPAeiEKXF
rYW++WtzMeRIRdCMbLG9PrCHD3iQHfZobBnuzx/JMXVc6a4TssbY9gk7qJ5BmlqRTU8zNJiiVmd8
pCFpJgwKzKkNrIgaQn48EgnwblmVkxSFnF2jwXpBt/naNudBguFUBthef2wfULl4uY00aZzHHNxA
bi15mzTdlSJu1vRtCQaEahng9ug7BZ6dyWCHOv74O/L5NEHI+jU+kHQeF2DJneE2yWNESzqhSECa
ZbRjjxNxiRn/HVAKyZdAjkGQVKUkyG8vjnc3Jw==
  1. Para a descriptografia assimétrica com RSA, execute:
IRISAPP>Set plaintext = ##class(dc.cryptosamples.Samples).DoRSADecrypt(ciphertext)
IRISAPP>Write plaintext
InterSystems
  1. Para a criptografia simétrica com AES CBC, execute:
IRISAPP>Do ##class(dc.cryptosamples.Samples).DoAESCBCEncrypt("InterSystems")
8sGVUikDZaJF+Z9UljFVAA==
  1. Para a descriptografia simétrica com AES CBC, execute:
IRISAPP>Do ##class(dc.cryptosamples.Samples).DoAESCBCDecrypt("8sGVUikDZaJF+Z9UljFVAA==")
InterSystems
  1. Para uma abordagem antiga com hash MD5, execute:
IRISAPP>Do ##class(dc.cryptosamples.Samples).DoHash("InterSystems")
rOs6HXfrnbEY5+JBdUJ8hw==
  1. Para uma abordagem recomendada com hash SHA, execute:
IRISAPP>Do ##class(dc.cryptosamples.Samples).DoSHAHash("InterSystems")
+X0hDlyoViPlWOm/825KvN3rRKB5cTU5EQTDLvPWM+E=
  1. Para sair do terminal:
Digite HALT ou H (não diferencia maiúsculas de minúsculas)

 

Sobre o código-fonte

1. Sobre a chave simétrica

# para usar com criptografia/descriptografia simétrica
ENVSECRETKEY=InterSystemsIRIS

No Dockerfile, foi criada uma chave do ambiente para ser usada como chave secreta em operações simétricas.

2. Sobre a chave assimétrica

# para usar com criptografia/descriptografia assimétrica, execute openssl req  -new -x509 -sha256 -config example-com.conf -newkey rsa:2048 -nodes -keyout example-com.key.pem  -days 365 -out example-com.cert.pem

No Dockerfile, foram geradas uma chave privada e uma chave pública para serem usadas com operações assimétricas.

3. Criptografia simétrica

//Amostra de chaves simétricas para criptografia
 
ClassMethodDoAESCBCEncrypt(plaintextAs%String)As%Status
{
    // converter para utf-8
    Settext=$ZCONVERT(plaintext,"O","UTF8")
   
    // definir uma chave secreta
    Setsecretkey=$system.Util.GetEnviron("SECRETKEY")
    SetIV=$system.Util.GetEnviron("SECRETKEY")
   
    // criptografar um texto
    Settext=$SYSTEM.Encryption.AESCBCEncrypt(text,secretkey,IV)
    Setciphertext=$SYSTEM.Encryption.Base64Encode(text)
   
    Writeciphertext
}

A operação AES CBC Encrypt foi usada para criptografar textos.
A codificação base64 retorna os resultados como um texto organizado/legível para o usuário.

4. Descriptografia simétrica

//Amostra de chaves simétricas para descriptografia
 
ClassMethodDoAESCBCDecrypt(ciphertextAs%String)As%Status
{
    // definir uma chave secreta
    Setsecretkey=$system.Util.GetEnviron("SECRETKEY")
    SetIV=$system.Util.GetEnviron("SECRETKEY")
   
    // descriptografar um texto
    Settext=$SYSTEM.Encryption.Base64Decode(ciphertext)
    Settext=$SYSTEM.Encryption.AESCBCDecrypt(text,secretkey,IV)
   
    Setplaintext=$ZCONVERT(text,"I","UTF8")
    Writeplaintext
}

A operação AES CBC Decrypt foi usada para descriptografar textos.
A decodificação base64 retorna o texto criptografado a um binário, para ser usado na descriptografia.

5. Criptografia assimétrica

//Amostra de chaves assimétricas para criptografia
 
ClassMethodDoRSAEncrypt(plaintextAs%String)As%Status
{
    // obter certificado público
    SetpubKeyFileName="/opt/irisbuild/example-com.cert.pem"
    SetobjCharFile=##class(%Stream.FileCharacter).%New()
    SetobjCharFile.Filename=pubKeyFileName
    SetpubKey=objCharFile.Read()
 
    // criptografar usando RSA
    Setbinarytext=$System.Encryption.RSAEncrypt(plaintext,pubKey)
    Setciphertext=$SYSTEM.Encryption.Base64Encode(binarytext)
   
    Returnciphertext
}

É preciso obter o conteúdo do arquivo da chave pública para criptografar com RSA.
A operação RSA Encrypt foi usada para criptografar textos.

6. Descriptografia assimétrica

//Amostra de chaves assimétricas para descriptografia
 
ClassMethodDoRSADecrypt(ciphertextAs%String)As%Status
{
    // obter chave pública
    SetprivKeyFileName="/opt/irisbuild/example-com.key.pem"
    SetprivobjCharFile=##class(%Stream.FileCharacter).%New()
    SetprivobjCharFile.Filename=privKeyFileName
    SetprivKey=privobjCharFile.Read()
 
    // obter ciphertext em formato binário
    Settext=$SYSTEM.Encryption.Base64Decode(ciphertext)
 
    // descriptografar texto usando RSA
    Setplaintext=$System.Encryption.RSADecrypt(text,privKey)
 
    Returnplaintext
}

É preciso obter o conteúdo do arquivo da chave privada para descriptografar com RSA.
A operação RSA Decrypt foi usada para descriptografar textos.

7. Texto com hash usando MD5 (abordagem antiga)

//Amostra de hash
 
ClassMethodDoHash(plaintextAs%String)As%Status
{
    // converter para utf-8
    Settext=$ZCONVERT(plaintext,"O","UTF8")
   
    // hash de um texto
    Sethashtext=$SYSTEM.Encryption.MD5Hash(text)
   
    Setbase64text=$SYSTEM.Encryption.Base64Encode(hashtext)
 
    // converter para texto hex para seguir as melhores práticas
    Sethextext=..GetHexText(base64text)
 
    // retornar usando minúsculas
    Write$ZCONVERT(hextext,"L")
}

A operação MD5 Hash fará a criptografia do texto e não será possível descriptografar.
O hash com MD5 não é recomendado para novos projetos por não ser considerado seguro. Por isso, foi substituído por SHA. O InterSystems IRIS oferece compatibilidade com SHA (veja nosso próximo exemplo).

8. Texto com hash usando SHA (abordagem recomendada)

Usaremos o método de hash SHA-3 para esta amostra. De acordo com a documentação do InterSystems, esse método gera um hash usando um dos Algoritmos de Hash Seguro dos EUA - 3. Consulte a Publicação 202 dos Federal Information Processing Standards para saber mais. 

//Hash usando SHA
 
ClassMethodDoSHAHash(plaintextAs%String)As%Status
{
    // converter para utf-8
    Settext=$ZCONVERT(plaintext,"O","UTF8")
   
    // hash de um texto
    Sethashtext=$SYSTEM.Encryption.SHA3Hash(256,text)
   
    Setbase64text=$SYSTEM.Encryption.Base64Encode(hashtext)
 
    // converter para texto hex para seguir as melhores práticas
    Sethextext=..GetHexText(base64text)
 
    // retornar usando minúsculas
    Write$ZCONVERT(hextext,"L")
}

No método SHA, é possível definir o comprimento do bit usado em uma operação de hash. Quanto maior o número de bits, mais difícil é decifrar o hash. No entanto, o processo de hashing também fica mais lento. Na amostra, usamos 256 bits. Você pode escolher estas opções de comprimento de bit:

  • 224 (SHA-224)
  • 256 (SHA-256)
  • 384 (SHA-384)
  • 512 (SHA-512)