Conjunto de conceptos básicos para realizar los procesos de Firma Electrónica
Base 64
Los esquemas de codificación Base64 se usan frecuentemente, cuando se necesita tratar con datos binarios para que sean almacenados y transferidos sobre un medio diseñado para tratar con datos de tipo texto, con el propósito de asegurar que los datos se mantienen intactos y sin modificaciones durante la transmisión.
Developer Mozilla
Base64 es un grupo de esquemas de codificación de binario a texto que representa los datos binarios mediante una cadena ASCII, traduciéndolos en una representación radix-64. El término Base64 se origina de un sistema de codificación de transmisión de contenido MIME específico. Base 64 es un sistema de numeración posicional que usa 64 como base. Es la mayor potencia de 2 que puede ser representada usando únicamente los caracteres imprimibles de ASCII.
La codificación en Base64 no es un método para proteger (cifrar) la información sino un método para transportarla, sin que sufra alteraciones de codificación regional.
- Esta codificación se usará para enviar los paquetes criptográficos entre el cliente y el servidor.
Ejemplo
- Herramienta: https://www.base64encode.org/
http://www.fararoni.net/
aHR0cDovL3d3dy5mYXJhcm9uaS5uZXQv
Codificar y decodificar Base64
Javascript
En JavaScript hay dos funciones para decodificar y codificar cadenas base64, respectivamente:
La función atob()
decodifica una cadena de datos que ha sido codificada usando la codificación en base 64. Por el contrario, la función btoa()
crea una cadena ASCII codificada en base 64 a partir de una \»cadena\» de datos binarios.
El \»Problema Unicode\»
https://developer.mozilla.org/es/docs/Web/API/WindowBase64/Base64_codificando_y_decodificando#El_Problema_Unicode
.Java
import org.bouncycastle.util.encoders.Base64; public class Main{ public static void main(String[] args) { if (args.length > 0) { for (int i = 0; i < args.length; i++) { if (args[i].equals(\"-e\") || args[i].equals(\"--encode\")) { String toEncode = args[i + 1] != null && args[i + 1].length() > 0 ? args[i + 1] : \"\"; toEncode = new String(toEncode.getBytes()); byte[] data = Base64.encode(toEncode.getBytes()); String encoded = new String(data); System.out.println(\"Resultado de la codificación: \" + encoded); } else if (args[i].equals(\"-d\") || args[i].equals(\"--decode\")) { String toDecode = args[i + 1] != null && args[i + 1].length() > 0 ? args[i + 1] : \"\"; byte[] data = Base64.decode(toDecode.getBytes()); String decoded = new String(data); System.out.println(\"Resultado de la decodificación: \" + decoded); } } }else{ System.out.println(\"Nada que hacer... finalizando programa...\"); } } }
Ejemplo Llave privada en base64 sin contraseña en formato PEM
-----BEGIN RSA PRIVATE KEY----- MIICXgIBAAKBgQDArCo5om1eOPsVVkgG57X0VZI+Y/kqSRRqtOVBGj8rKx38nYjH VqAkKS4sYRsvLtXI+1courEksbrhYxkYJOc1rqm6uyWSIbrtwhSStoETa2/+3Zsv tGYakQARhlPm6Pqyj6DjiNZrMW8JjtSehr4grd17Aub6L3wv28tkHvIizwIDAQAB AoGBALxMReQXws0v4OsEbNYaw++rZYaGC+/whfyXF+pdLVkSBXdpulAeb9mHSXHj 4T5mhlaqlI7gjdkvvVUilVbMUgypGYr8D7tw+cIw4dY59T+iYJP4ohu0/9QxT61z LaxCDWz1oQSWrqVrC2YeBMZlUMqoj60qhZuN/nMLuMlf69s5AkEA6gDl7P8sgMk5 ur0BIpDDsAiXS0GwbrbKg+b9Ha7OAG+8rMG4K8oTSNXsZESLrN2ZcLzr08Xp/GIv 8qZzWoT17QJBANLIq6mQKXjPYX9PYvFB4voQJ2uBzARbT+9IBEki9IeBoa+8KMlh XatepWNnWN+EGFu25K+TYimWvW/alL81pCsCQQDGsbyKYKIJONQsHBC6qPGAp8rP vBdz6wJKvfhvG98Pv9EVX+hiRlPZpMv0179CKWgAsmoMiCEGjNjp0Sxh0ESBAkEA jrmCQxZyfnMtuV6vyFysrFYz2v/QfUK3JXbGMB+TJA4KxUvK8lETc+5qXpyj+PUg 6Tk2MAzD8xU2wH5pKe/QcQJAEYsi0vjsIzcIOaCRRPA+H0kOEgx4wPZmKNrLNGru gBIUpRlCzi6zGAhq3KVosQeqp0TAg9aSREW+Jux6nYJigA== -----END RSA PRIVATE KEY-----
Ejemplo Llave privada en base64 con contraseña en formato PEM
-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,40B029D5AE25EDB0 n/giCSQ/F91Zn1sAfdx8qO6fNNHYIJijtTUWABCrP9t8B/WLXkdhpOE4f/8pq1mc NesOY6/wIwWxOOilBXjcOFUuvJAIys6M6YXhVt5i3efU5NxdfLHGcUtMh2sQnVia X1c094aMONYtVXOfTphWnSIwillGIIRaDkwZXV8T1dxt4X0uzXM7EFTYi6cYE9Ok 3931+ehoRUN8wPqblZpCVqaM14m71nI9VC7PYe72Dhu/62B/PHl5uX551KV0ABHv rn1rycdsz0c+ynu1No2Hx0MacP//QzRjHkfhKbHCJEOHCSQIRQw8noU035cXmG3O zMoxZFgPpZPSbBYK/F3xtcqos+Zfp9neE9d/K/LHUC2W2YRl9bMZV3xcV9jArqJ4 3pL4Q6qwF8XG2Qeu1kUBtkOXqmUNa+6y7FaPCPbjS3sBXKBc+Ysgei2KWSmRDNR6 urulvRNhtfTJzLM52KlvAjg6rj8O+YFaErz8fJ2TiDDBiUdcKMLbH1uADe+aZyEt LvshfAtyl7lKpdWxCro6wfCvkt95YRvQa1JILV6eVnhu5CZWtc3hjCaJuiSTvkjK fxXaZWLNC9L2Du+xR4ceBk4L1BSu6k6up1nlTqctj9znRJ5BdkOdxkNhCbU9MI65 TthIFHkRAjHZUsJx79EhsLPH1lh9VPMxgNdYTr9OuYC+ro9pKinHsGnbQIkCOEkt OSKwelU94DrOcpzIvqIeV4dxxCHPHLaeLUN13w3mLX0vtbLKb8Ml0CkTjzFBYA4H DmgS3duVXUnPO4GDxcn+ZrXPDdBCqMW1nFG0BVgsBwuwd4v5LvgCtw== -----END RSA PRIVATE KEY-----
Ejemplo certificado en base64 en formato PEM
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDArCo5om1eOPsVVkgG57X0VZI+ Y/kqSRRqtOVBGj8rKx38nYjHVqAkKS4sYRsvLtXI+1courEksbrhYxkYJOc1rqm6 uyWSIbrtwhSStoETa2/+3ZsvtGYakQARhlPm6Pqyj6DjiNZrMW8JjtSehr4grd17 Aub6L3wv28tkHvIizwIDAQAB -----END PUBLIC KEY----- -----BEGIN CERTIFICATE----- MIIDpDCCAoygAwIBAgIUMDAwMDEwMDAwMDAwMDAwMDAxMTQwDQYJKoZIhvcNAQEF BQAwgcMxGTAXBgNVBAcTEENpdWRhZCBkZSBNZXhpY28xFTATBgNVBAgTDE1leGlj bywgRC5GLjELMAkGA1UEBhMCTVgxGjAYBgNVBAMTEUFDIGRlIFBydWViYXMgU0FU MTYwNAYDVQQLFC1BZG1pbmlzdHJhY2nzbiBkZSBTZWd1cmlkYWQgZGUgbGEgSW5m b3JtYWNp824xLjAsBgNVBAoUJVNlcnZpY2lvIGRlIEFkbWluaXN0cmFjafNuIFRy aWJ1dGFyaWEwHhcNMDQwODAyMTk0NzEzWhcNMDYwODAyMTk0NzEzWjCBuDElMCMG A1UELRMcQUFBMDEwMTAxQUFBIC8gQUFBQTAxMDEwMUFBQTEeMBwGA1UEBRMVIC8g QUFBQTAxMDEwMUhERlJYWDAwMRowGAYDVQQKExFFbXByZXNhIGRlIFBydWViYTEb MBkGA1UECxMSU3VjdXJzYWwgZGUgUHJ1ZWJhMRowGAYDVQQDExFFbXByZXNhIGRl IFBydWViYTEaMBgGA1UEKRMRRW1wcmVzYSBkZSBQcnVlYmEwgZ8wDQYJKoZIhvcN AQEBBQADgY0AMIGJAoGBAMCsKjmibV44+xVWSAbntfRVkj5j+SpJFGq05UEaPysr HfydiMdWoCQpLixhGy8u1cj7Vyi6sSSxuuFjGRgk5zWuqbq7JZIhuu3CFJK2gRNr b/7dmy+0ZhqRABGGU+bo+rKPoOOI1msxbwmO1J6GviCt3XsC5vovfC/by2Qe8iLP AgMBAAGjHTAbMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgPoMA0GCSqGSIb3DQEB BQUAA4IBAQA3c1OpeaWhP1Qt5XBb3CKogVjo8oUfIJdayTYVG/jy/STtWUJpQ5V1 4esa4ZrhTtYT1ZJiXPwQTS1fEDNr4XrmyFoimXfj9/pemGu/61skcViVB2rw3H6S 5Mn8b2ICx6zAK+KVoFal/mJpXLOGvH4S7E529MneLh6rktDxJ+338fFgF2sEZItf NaSeAsX4Nllsz4G4re0nnSShD3T9y6o2nMpOwphMgpy12HsQm7XxIvZe+SIUjhBk Q7UVz9/6yuD/Hguh38vnU9j98VWahVjUT4BnI1RTPiYlaxlMsqQOkh1QIbOufki5 4wledKtwlkS5x71yo3HMVR9CMK2GJV39 -----END CERTIFICATE-----
Ejercicios
Si no tiene certificados de desarrollo, puede usar su FIEL emitida por el SAT
- Convertir la llave privada de un certificados a formato Base64 (PEM)
openssl pkcs8 -inform DER -in CON010716A98.key -out CON010716A98.key.pem -passin pass:12345678a
- Convertir un certificado X509v3 a formato Base64 (PEM)
openssl x509 -inform DER -outform PEM -in CON010716A98.cer -out CON010716A98.cer.pem
- Abra los archivos origen y los que se generaron:
• CON010716A98.key • CON010716A98.key.pem • CON010716A98.cer • CON010716A98.cer.pem