Artículo
· 11 dic, 2023 Lectura de 8 min

Dominando la clase %SYSTEM.Encryption

InterSystems IRIS tiene un excelente soporte en operaciones de encriptación, desencriptación y hacina. Dentro del manual de la clase %SYSTEM.Encryption existen métodos para el uso de los principales algoritmos del mercado.

Algoritmos y tipos de Encriptación/Desencriptación de IRIS

Como puedes comprobar, las operaciones están basadas en claves y incluyen 3 opciones:

  • Symmetric Keys:  Las partes que realizan operaciones de cifrado y descifrado comparten la misma clave secreta.
  • Asymmetric Keys: Las partes que realizan operaciones de cifrado y descifrado comparten la misma clave secreta para el cifrado. Sin embargo, para el descifrado cada socio tiene una clave privada. Esta clave no se puede compartir ya que es una prueba de identidad.
  • Hash: Se utiliza cuando no es necesario descifrar, sino solo cifrar. Es un enfoque común cuando se trata de almacenar contraseñas de usuario.

 

Diferencias entre Encriptación Simétrica y Asimétrica

  • La encriptación simétrica utiliza una única clave que debe compartirse entre las personas que necesitan recibir el mensaje, mientras que la asimétrica utiliza un par de claves públicas y una clave privada para cifrar y descifrar mensajes durante la comunicación.
  • La encriptación simétrica es una técnica antigua, mientras que la encriptación asimétrica es relativamente nueva.
  • La encriptación asimétrica se introdujo para complementar el problema inherente de la necesidad dwe compartir la clave en un modelo de criptografía simétrica, eliminando la necesidad de compartir la clave mediante el uso de un par de claves pública y privada.
  • La criptografía asimétrica requiere relativamente mas tiempo que la criptografía simétrica.

 

Diferencias Clave

Encriptación Simétrica

Encriptación Asimétrica

Longitud del texto cifrado

Texto cifrado más pequeño que el archivo original de texto plano

Texto cifrado más grande que el archivo original de texto plano.

Tamaño de los datos

Utilizado para transmitir grandes volúmenes de datos.

Utilizado para transmitir pequeños volúmenes de datos

Consumo de recursos

Funciona con un bajo consumo de recursos

Requiere un alto consumo de recursos

Longitud de la clave

128 or 256-bit

RSA 2048-bit o mayor.

Seguridad

Menos seguro debido al uso de una sola clave para el cifrado

Mucho mas seguro ya que en el cifrado y descifrado se usan dos claves diferentes.

Numero de claves

Usa una única clave para el encriptado y desencriptado

Usa dos claves distintas una para encriptación y otra para desencriptación.

Técnicas

Es una técnica antigua

Es una técnica moderna

Confidencialidad

El uso de una única clave para el cifrado y descifrado aumenta las posibilidades de que la clave sea comprometida.

Se crean dos claves por separado para el cifrado y el descifrado, lo que elimina la necesidad de compartir una clave.

Velocidad

Es una técnica más rápida.

Es mas lenta en términos de velocidad.

Algoritmos

RC4, AES, DES, 3DES y QUAD.

RSA, Diffie-Hellman, algoritmos ECC.

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

 

Usando la clase %SYSTEM.Encryption para Encriptar, Desencriptar y Hash

 

Para realizar el ejercicio con IRIS para operaciones de encriptado, desencriptado y has visita https://github.com/yurimarx/cryptography-samples, sigue estos pasos:

1. Clona / git pull el repo en cualquier directorio local

$ git clone https://github.com/yurimarx/cryptography-samples.git

2. Abre un terminal de Docker en ese directorio y ejecuta:

$ docker-compose build

3. Levanta el container de IRIS:

$ docker-compose up -d

4. Abre un terminal de IRIS:

$ docker-compose exec iris iris session iris -U IRISAPP

IRISAPP>

5. Para realizar una encriptación RSA asimétrica ejecuta este comando:

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==

6. Para realizar una desencriptación RSA asimétrica ejecuta este comando:

IRISAPP>Set plaintext = ##class(dc.cryptosamples.Samples).DoRSADecrypt(ciphertext)
IRISAPP>Write plaintext
InterSystems

7. Para realizar una encriptación AES CBC de manera sincronía ejecuta este comando:

IRISAPP>Do ##class(dc.cryptosamples.Samples).DoAESCBCEncrypt("InterSystems")
8sGVUikDZaJF+Z9UljFVAA==

8. Para realizar una desencriptación AES CBC simétrica ejecuta este comando:

IRISAPP>Do ##class(dc.cryptosamples.Samples).DoAESCBCDecrypt("8sGVUikDZaJF+Z9UljFVAA==")
InterSystems

9. Para realizar un has MD5  con un enfoque antiguo, ejecuta:

IRISAPP>Do ##class(dc.cryptosamples.Samples).DoHash("InterSystems")
rOs6HXfrnbEY5+JBdUJ8hw==

10. Para realizar un has SHA con el enfoque recomendado, ejecuta:

IRISAPP>Do ##class(dc.cryptosamples.Samples).DoSHAHash("InterSystems")
+X0hDlyoViPlWOm/825KvN3rRKB5cTU5EQTDLvPWM+E=

11. Para salir del terminal ejecuta una de las siguientes opciones:

Enter HALT or H (not case-sensitive)

 

Acerca del código fuente

1. Acerca de la clave simétrica:

# para usar con encriptación y desencriptación simétrica
ENV SECRETKEY=InterSystemsIRIS

El el fichero Dockerfile, existe una variable de entorno para usar en las operaciones simétricas.

 

2. Acerca de la clave asimétrica

# para usar con operaciones de encriptado y desencriptado asimetricas
RUN 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

El el fichero Dockerfile, existe una variable de entorno para usar en las operaciones asimétricas.

 

3. Encriptación Simétrica

// Symmetric Keys sample to encrypt
 
ClassMethod DoAESCBCEncrypt(plaintext As %String) As %Status
{
    // convert to utf-8
    Set text=$ZCONVERT(plaintext,"O","UTF8")
   
    // set a secret key
    Set secretkey = $system.Util.GetEnviron("SECRETKEY")
    Set IV = $system.Util.GetEnviron("SECRETKEY")
   
    // encrypt a text
    Set text = $SYSTEM.Encryption.AESCBCEncrypt(text, secretkey, IV)
    Set ciphertext = $SYSTEM.Encryption.Base64Encode(text)
   
    Write ciphertext
}

Se usa la operación AES CBC de encriptado para cifrar textos. La codificación Base64 devuelve los resultados como un texto bonito/legible para el usuario.

 

4. Desencriptación Simétrica

// Symmetric Keys sample to decrypt
 
ClassMethod DoAESCBCDecrypt(ciphertext As %String) As %Status
{
    // set a secret key
    Set secretkey = $system.Util.GetEnviron("SECRETKEY")
    Set IV = $system.Util.GetEnviron("SECRETKEY")
   
    // decrypt a text
    Set text=$SYSTEM.Encryption.Base64Decode(ciphertext)
    Set text=$SYSTEM.Encryption.AESCBCDecrypt(text,secretkey,IV)
   
    Set plaintext=$ZCONVERT(text,"I","UTF8")
    Write plaintext
}

Se usa la operación AES CBC de desencriptado para descifrar textos. La decodificación Base64 devuelve los resultados en formato binario, para que pueda utilizarse en el proceso de descifrado.

 

5. Encriptación Asimétrica

// Asymmetric Keys sample to encrypt
 
ClassMethod DoRSAEncrypt(plaintext As %String) As %Status
{
    // get public certificate
    Set pubKeyFileName = "/opt/irisbuild/example-com.cert.pem"
    Set objCharFile = ##class(%Stream.FileCharacter).%New()
    Set objCharFile.Filename = pubKeyFileName
    Set pubKey = objCharFile.Read()
 
    // encrypt using RSA
    Set binarytext = $System.Encryption.RSAEncrypt(plaintext, pubKey)
    Set ciphertext = $SYSTEM.Encryption.Base64Encode(binarytext)
   
    Return ciphertext
}

Es necesario obtener el contenido del archivo de clave pública para cifrar con RSA. En la operación se utiliza encriptación RSA para cifrar textos.

 

6. Desencriptación Asimétrica

// Asymmetric Keys sample to decrypt
 
ClassMethod DoRSADecrypt(ciphertext As %String) As %Status
{
    // get private key
    Set privKeyFileName = "/opt/irisbuild/example-com.key.pem"
    Set privobjCharFile = ##class(%Stream.FileCharacter).%New()
    Set privobjCharFile.Filename = privKeyFileName
    Set privKey = privobjCharFile.Read()
 
    // get ciphertext in binary format
    Set text=$SYSTEM.Encryption.Base64Decode(ciphertext)
 
    // decrypt text using RSA
    Set plaintext = $System.Encryption.RSADecrypt(text, privKey)
 
    Return plaintext
}

Es necesario obtener el contenido del archivo de clave privada para descifrar con RSA. En la operación se utiliza RSA Decrypt para descifrar textos.

 

7. Hashear texto utilizando MD5 (método antiguo)

// Hash sample
 
ClassMethod DoHash(plaintext As %String) As %Status
{
    // convert to utf-8
    Set text=$ZCONVERT(plaintext,"O","UTF8")
   
    // hash a text
    Set hashtext = $SYSTEM.Encryption.MD5Hash(text)
   
    Set base64text = $SYSTEM.Encryption.Base64Encode(hashtext)
 
    // convert to hex text to following best practices
    Set hextext = ..GetHexText(base64text)
 
    // return using lowercase
    Write $ZCONVERT(hextext,"L")
}

La operación MD5 Hash cifra el texto no se es posible descifrarlo. El uso de MD5 para hashear no se recomienda en nuevos proyectos debido a que se considera inseguro. Es por eso que fue reemplazado por SHA. InterSystems IRIS admite SHA (lo veremos en el siguiente ejemplo).

 

8. Hashear texto usando SHA (enfoque recomendado)

En este ejemplo se usa el método de has SHA-3. Según la documentación de InterSystems, este método genera un has utilizando uno de los Algoritmos de Hash Seguro de los Estados Unidos - 3. (Consulta la publicación 202 de los estándares de procesamiento de información federal para obtener más información).

// Hash using SHA
 
ClassMethod DoSHAHash(plaintext As %String) As %Status
{
    // convert to utf-8
    Set text=$ZCONVERT(plaintext,"O","UTF8")
   
    // hash a text
    Set hashtext = $SYSTEM.Encryption.SHA3Hash(256, text)
   
    Set base64text = $SYSTEM.Encryption.Base64Encode(hashtext)
 
    // convert to hex text to following best practices
    Set hextext = ..GetHexText(base64text)
 
    // return using lowercase
    Write $ZCONVERT(hextext,"L")
}

El método de SHA, admite establecer la longitud de bits utilizada en una operación de hash. Cuantos más bits, más difícil es descifrar el hash. Sin embargo, el proceso de hash también se ralentiza. En este ejemplo usamos 256 bits. Puedes elegir estas opciones para la longitud de bits:

  • 224 (SHA-224)
  • 256 (SHA-256)
  • 384 (SHA-384)
  • 512 (SHA-512)
Comentarios (0)1
Inicie sesión o regístrese para continuar