Conceptos básicos para Firma Electrónica

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

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