Las aplicaciones empresariales suelen tener necesidades de seguridad a
la hora de almacenar, transportar o intercambiar información, de ahí que
surge la necesidad de contar con un tipo de datos que permita manejar
el cifrado de textos y la firma de documentos.
A través de los tipos de datos para Criptografía se puede:
- Firmar digitalmente un texto.
- Validar la firma digital.
- Encriptar/desencriptar un texto.
- Calcular el hash de un texto dado.
Estos métodos utilizados en conjunto pueden permitir asegurar la
autenticación, integridad, la confidencialidad y el no repudio de los
mensajes.
Escenarios de uso
- Generalmente una contraseña no se debe almacenar en texto plano, sino que se almacena el resultado de aplicar el hash sobre la misma.
- Factura electrónica. Se usan funciones de Hash y firma digital.
Implementación de los tipos de datos para Criptografía
Se cuenta con los tipos de datos: CryptoHash, CryptoSign,
CryptoSymmetricEncrypt, CryptoAsymmetricEncrypt, CryptoCertificate,
CryptoXMLSign, que permiten resolver las necesidades de criptografía de
una aplicación GeneXus.
Se tiene un dominio enumerado CryptoAlgorithm que contiene los algoritmos de criptografía soportados.
A continuación se detallan los métodos asociados a cada uno de estos tipos de datos y ejemplos de uso.
CryptoHash
Métodos
Nombre | Descripción |
Compute(String text) | Retorna el texto resultado de aplicar la función de hash sobre el texto ingresado. |
Propiedades
Algorithm: String | Permite especificar el algoritmo de hash que se aplicará cuando se invoque al método Compute(String). Se utilizará el SHA256 por omisión. |
Ejemplo
El siguiente ejemplo usa el algoritmo SHA1 de Hash.
&CryptoHash.Algorithm = CryptoAlgorithm.HashSHA1 //&CryptoHash es de tipo CryptoHash.
//CryptoAlgorithm es un dominio enumerado que contiene los algoritmos de criptografía soportados.
&resultstringSHA1 = &CryptoHash.Compute(&text)
CryptoSign
Permite manipular firmas digitales con clave pública-privada según el estándar PKCS#7/CMS ó PKCS1 utilizando certificados X509.
Métodos
Nombre | Descripción |
Sign(String text, [boolean detached]): String | Retorna el texto resultado de aplicar el algoritmo de firmado utilizando el certificado especificado sobre el texto ingresado. El parámetro detached indica si se devuelve solamente la firma o si se devuelve la firma junto con el contenido. El parámetro detached solamente es válido cuando se maneja el formato PKCS7. |
Verify(String signature, String text, [boolean detached]): Boolean | Dado un texto y una firma, verifica si la firma corresponde al texto utilizando la información del certificado configurado. El parámetro detached solamente es válido cuando se maneja el formato PKCS7. |
Propiedades
Certificate: CryptoCertificate | Permite especificar el certificado que se utilizará para firmar el texto. |
Algorithm: CryptoAlgorithm | Permite especificar el algoritmo de firmado. |
ValidateCertificate: Boolean | Especifica si en el método Verify se debe validar o no que el certificado sea un certificado válido. |
Ejemplo
A. Cómo firmar un texto
En el siguiente ejemplo dado un certificado en formato .pfx, se firma un texto usando el algoritmo de Hash SignSHA1withRSA.
Primero se carga el certificado de disco; si no hay errores en la carga del mismo, se pregunta si éste tiene clave privada para poder firmar el texto. En caso positivo se selecciona un algoritmo de Hash para el firmado y se firma el texto usando el método Sign.
Primero se carga el certificado de disco; si no hay errores en la carga del mismo, se pregunta si éste tiene clave privada para poder firmar el texto. En caso positivo se selecciona un algoritmo de Hash para el firmado y se firma el texto usando el método Sign.
&errorCode = &CryptoCert.Load("my_keystore.pfx", &pwd) //&CryptoCert es de tipo CryptoCertificate.
if &errorCode = 0
if (&CryptoCert.HasPrivateKey())
&CryptoSign.Algorithm = CryptoAlgorithm.SignSHA1withRSA //&CryptoSin es de tipo CryptoSign.
//CryptoAlgorithm es un dominio enumerado que contiene los algoritmos de criptografía soportados.
&CryptoSign.Certificate = &CryptoCert
&signedText = &CryptoSign.Sign(&textToSign, false)
if &CryptoSign.ErrCode <> 0
//Process Errors
endif
else
//Process Errors
endif
else
//Process Errors
endif
B. Cómo verificar la firma de un texto
Dado el certificado con clave pública, se verifica la firma del texto como se muestra en el ejemplo a continuación:
&errorCode = &CryptoCert.Load("MyPublicKey.cer")
if &errorCode = 0
&CryptoSign.Certificate = &CryptoCert //&CryptoSign de tipo CryptoSign.
&CryptoSign.ValidateCertificate = True //Truesignifica que el certificado es validado en el proceso de validación de la firma.
&isOK = &CryptoSign.Verify(&SignedText,&TextToSign,false)
if not &isOK
//Process Errors
else
//OK
endif
else
//Process Errors
endif
CryptoXMLSign
Permite manipular firmas digitales para documentos XML con clave pública-privada según el estándar XMLDSIG utilizando certificados X509.
Métodos
Nombre | Descripción |
Sign(String text): String | Retorna el texto resultado de aplicar el algoritmo de firmado utilizando el certificado especificado sobre el texto ingresado. |
SignElements(String:text,String:Xpath) | El primer parámetro es el XML y el segundo el Xpath. Retorna el texto resultado de aplicar el algoritmo de firmado utilizando el certificado especificado sobre el texto ingresado en el Xpath indicado. |
Verify(String signature) | Dado un texto y una firma, verifica si la firma corresponde al texto utilizando la información del certificado configurado. |
CryptoSymmetricEncrypt
Permite cifrar un texto utilizando un algoritmo simétrico (DES, Rijndael, TripleDES).
El método Create permite especificar el algoritmo que se utilizará para
encriptar el texto. De esta manera se puede elegir el algoritmo de
encriptación sin necesidad de agregar un nuevo tipo de dato.
Métodos
Nombre | Descripción |
Encrypt(String text) | Dado un texto retorna un texto cifrado utilizando criptografía simétrica según el algoritmo, clave (Key) y vector de inicialización (IV) especificados. |
Decrypt(String text) | Devuelve el texto dado descifrado según el algoritmo, clave (Key) y vector de inicialización (IV) especificados. |
Propiedades
Algorithm: CryptoAlgorithm | Permite especificar el algoritmo de encriptación. |
Key: String | Clave de cifrado, se genera automaticamente al crear la instancia. |
IV: String | Vector de inicialización de cifrado, se genera automáticamente al crear la instancia. |
KeySize: Numeric | |
BlockSize: Numeric |
Ejemplo
A. Encriptar un texto usando un algoritmo simétrico.
En el siguiente ejemplo se encripta el texto contenido en la variable &text, usando el algoritmo TripleDES.
&CryptoEncrypt.Key ="jSYUCTshqx0kOuDs58Nshb1OkZj7mh1S" //CryptoEncrypt es de tipo CryptoSymmetricEncrypt
&CryptoEncrypt.Algorithm = CryptoAlgorithm.EncryptTripleDES
&result = &CryptoEncrypt.Encrypt(&Text) //Se encripta el texto y se obtiene el resultado.
B. Desencriptar un texto encriptado con un algoritmo simétrico.
&Text = &CryptoEncrypt.Decrypt(&EncryptedText) //CryptoEncrypt es de tipo CryptoSymmetricEncrypt
//Process Errors
msg(format("Error %1 %2", &Cryptoencrypt.ErrCode.ToString(), &Cryptoencrypt.ErrDescription))
CryptoAsymmetricEncrypt
Permite cifrar un texto utilizando un algoritmo asimétrico.
Métodos
Nombre | Descripción |
Encrypt(String text) | Dado un texto lo retorna cifrado utilizando criptografía asimétrica según el algoritmo y clave pública del certificado especificado. |
Decrypt(String text) |
Devuelve el texto dado descifrado según el algoritmo y clave privada
del certificado especificado. Requiere que el certificado contenga la
clave privada. |
Propiedades
Algorithm: String | Permite especificar el algoritmo de hash que se usará. Se utilizará el SHA256 por omisión. |
Certificate: GXCertificate | Permite especificar el certificado que se utilizará para encriptar o desencriptar. |
Ejemplo
A. Encriptar un texto usando un algoritmo de encriptación asimétrico.
En el siguiente ejemplo, se encripta un texto dado un certificado de clave pública.
&ErrorCode = &cryptoCert.Load("MyPublicKey.cer")
if &ErrorCode = 0
&CryptoEncrypt.Certificate = &cryptoCert //&CryptoEncrypt es de tipo CryptoAsymmetricEncrypt
&result = &CryptoEncrypt.Encrypt(&Text)
if &CryptoEncrypt.ErrCode <> 0
//Process Errors
endif
endif
B. Desencriptar un texto encriptado con un algoritmo asimétrico.
En este ejemplo se muestra como se desencripta un texto encriptado usando un algorimto asimétrico.
&ErrorCode = &cryptoCert.Load("MyPFX.pfx",&pwd) //&CryptoCert es de tipo CryptoCertificate.
if &ErrorCode= 0
if &cryptoCert.HasPrivateKey()
&CryptoEncrypt.Certificate = &cryptoCert //&CryptoEncrypt es de tipo CryptoAsymmetricEncrypt
&Text= &CryptoEncrypt.Decrypt(&EncryptedText)
else
//Process Errors
endif
else
//Process Errors
endif
CryptoCertificate
Es una API que permite la manipulación de certificados.
Métodos
Load(String certPath, [password]): Int ErrCode | Permite inicializar un certificado a partir de la ruta y el password en caso de que sea necesario. |
FromBase64(String data) | Inicializa el certificado a partir de su representación en base64. |
ToBase64(): String | Obtiene una representación del certificado en base64. |
KeyInfo: StringCollection | Permite especificar que información del certificado debe ser agregada a la firma cuando se genera una firma XML. |
HasPrivateKey(): Boolean | Devuelve true si el certificado tiene asociado una private key. La private key es imprescindible para desencriptar un texto. |
Verify(): Boolean | Indica si el certificado es confiable. |
Propiedades
Issuer: Character |
Subject: Character |
SerialNumber: Character |
Thumbprint: Character |
NotAfter: DateTime |
NotBefore: DateTime |
Version: Character |
ErrCode Retorna el error de la última operación |
ErrDescription Retorna la descripción del error de la última operación |
Certificados soportados
NET (para el firmado digital, se necesita que tenga asociada la clave privada)
- DER Encoded Binary X.509 (.cer)
- Base64 Encoded X.509 (.cer)
- PKCS#7 / Cryptographic Message Syntax Standard (.p7b)
- PKCS#12 / Personal Information Exchange (.pfx o .p12)
JAVA
- DER Encoded Binary X.509 (.cer)
- Base64 Encoded X.509 (.cer)
- PKCS#7 / Cryptographic Message Syntax Standard (.p7b)
- PKCS#12 / Personal Information Exchange (.pfx o .p12)
- Java Key Store (.jks)
1 comentario:
Olá, tem algum exemplo usando CryptoSignXML ?
Publicar un comentario