¿Qué es el sello digital?
El sello digital es un elemento básico en la factura electrónica es el que señala la relación entre emisor y receptor y que permite al SAT comprobar que no han falsificados los datos del comprobante. De tal manera el sello digital funge como elemento clave para las finanzas de la empresa, porque estaremos seguros de que el receptor no ha cambiado nada, y del estado, que evitará los fraudes fiscales.
Para simplificar las cosas, podemos hacer un símil con la firma de toda la vida. Ésta señalaba la validez o el acuerdo de una persona frente a un documento. Sin embargo la escritura es fácil de falsificar. El sello digital es la firma, es el consentimiento de la persona y su representación física en los documentos, pero ahora es más difícil de falsificar.
Elementos utilizados en la generación de Sellos Digitales
- Cadena Original del elemento a sellar.
- Certificado de Sello Digital y su correspondiente clave privada.
- Algoritmos de criptografía de clave pública para firma electrónica avanzada.
- Especificaciones de conversión de la firma electrónica avanzada a Base64.
Para la generación de sellos digitales se utiliza criptografía de clave pública aplicada a una cadena original.
¿Qué es la Criptografía de la Clave Pública?
La criptografía de Clave Pública se basa en la generación de una pareja de números muy grandes relacionados entre sí, de tal manera que una operación de encripción sobre un mensaje tomando como clave de encripción a uno de los dos números, produce un mensaje alterado en su significado que sólo puede ser de vuelto a su estado original mediante la operación de desencripción correspondiente tomando como clave de desencripción al otro número de la pareja.
El Certificado puede distribuirse libremente para efectos de intercambio seguro de información y para ofrecer pruebas de autoría de archivos electrónicos o confirmación de estar de acuerdo con su contenido, ambos mediante el proceso de nominado “firmado electrónico avanzado”, que consiste en una característica observable de un mensaje, verificable por cualquiera con acceso al certificado digital del emisor, que sirve para implementar servicios de seguridad para garantizar:
- La integridad (facilidad para detectar si un mensaje firmado ha sido alterado).
- No repudiación del mensaje firmado (capacidad de impedir que el autor de la firma niegue haber firmado el mensaje).
- La autenticidad.
- Certidumbre de origen (facilidad para determinar qué persona es el autor de la firma que valida el contenido del mensaje).
Los algoritmos utilizados en la generación de un sello digital son los siguientes:
- SHA-2256, que es una función hash de un solo sentido tal que para cualquier entrada produce una salida compleja de 256bits (32 bytes) denominada “digestión”.
- RSAPrivateEncrypt, que utiliza la clave privada del emisor para encriptar la digestión del mensaje.
- RSAPublicDecrypt, que utiliza la clave pública del emisor para desencriptar la digestión del mensaje.
¿Qué es la cadena original?
Se entiende como cadena original, a la secuencia de datos formada con la información contenida dentro del comprobante fiscal digital por Internet, establecida en el Rubro I.A. de este anexo, construida aplicandolas siguientes reglas.
Reglas Generales:
- Ninguno de los atributos que conforman al comprobante fiscal digital por Internet debe contener el carácter|(pleca) debido a que éste es utilizado como carácter de control en la formación de la cadena original.
- El inicio de la cadena original se encuentra marcado mediante una secuencia de caracteres||(doble pleca).
- Se expresa únicamente la información del dato sin expresar el atributo al que hace referencia. Esto es, si el valor de un campo es “A” y el nombre del campo es ” Concepto “, sólo se expresa|A|y nunca|Concepto A|.
- Cada dato individual se debe separar de su dato subsiguiente, en caso de existir, mediante un carácter|(pleca sencilla).
Los datos opcionales no expresados, no aparecen en la cadena original y no tienen delimitador alguno. - El final de la cadena original se expresa mediante una cadena de caracteres ||(doble pleca).
- Toda la cadena original se expresa en el formato de codificación UTF-8.
- El nodo o nodos adicionales <ComplementoConcepto> se integran a la cadena original como se indica en la secuencia de formación en su numeral 10, respetando la secuencia de formación y número de orden del ComplementoConcepto.
- El nodo o nodos adicionales <Complemento> se integra al final de la cadena original respetando la secuencia de formación para cada complemento y número de orden del Complemento.
Los espacios en blanco que se presenten dentro de la cadena original son tratados de la siguiente manera:
- Se deben reemplazar todos los tabuladores, retornos de carro y saltos de línea por el carácter espacio (ASCII32).
- Acto seguido se elimina cualquier espacio al principio y al final de cada separador |(pleca).
- Finalmente, toda secuencia de caracteres en blanco se sustituye por un único carácter espacio (ASCII32).
- El final de la cadena original se expresa mediante una cadena de caracteres ||(doble pleca).
- Toda la cadena original se expresa en el formato de codificación UTF-8.
- El nodo o nodos adicionales <ComplementoConcepto> se integran a la cadena original como se indica en la secuencia de formación en su numeral 10, respetando la secuencia de formación y número de orden del ComplementoConcepto.
- El nodo o nodos adicionales <Complemento> se integra al final de la cadena original respetando la secuencia de formación para cada complemento y número de orden del Complemento.
- El nodo Timbre Fiscal Digital del SAT se integra posterior a la validación realizada por un proveedor autorizado por el SAT que forma parte de la Certificación Digital del SAT. Dicho nodo no se integra a la formación de la cadena original del CFDI, las reglas de conformación de la cadena original del nodo se describen en el Rubro III.B. del anexo 20
Secuencia de Formación
La secuencia de formación siempre se registra en el orden que se expresa en el apartado correspondiente a cada uno de los comprobantes fiscales, complementos y del timbre fiscal digital del SAT, tomando en cuenta las reglas generales expresadas en el párrafo anterior.
Generación del Sello Digital
Para toda cadena original a ser sellada digitalmente, la secuencia de algoritmos a aplicar es la siguiente:
- Aplicar el método de digestión SHA-2256 a la cadena original a sellar incluyendo los nodos Complementarios. Este procedimiento genera una salida de 256 bits (32bytes) para todo mensaje.
Con la clave privada correspondiente al certificado digital del firmante del mensaje, encriptar la digestión del mensaje obtenida en el paso I utilizando para ello el algoritmo de encripción RSA.
- El resultado es una cadena binaria que no necesariamente consta de caracteres imprimibles, por lo que debe traducirse a una cadena que sí conste solamente de tales caracteres.
- Para ello se utiliza el modo de expresión de secuencias de bytes denominado “Base64”, que consiste en la asociación de cada 6 bits de la secuencia a un elemento de un “alfabeto” que consta de 64 caracteres imprimibles.
- Puesto que con 6 bits se pueden expresar los números del 0 al 63, si a cada uno de estos valores se le asocia un elemento del alfabeto se garantiza que todo byte de la secuencia original puede ser mapeado a un elemento del alfabeto Base64, y los dos bits restantes forman parte del siguiente elemento a mapear.
- Este mecanismo de expresión de cadenas binarias produce un incremento de 33 % en el tamaño de las cadenas imprimibles respecto de la original.
La codificación en base64, así como su decodificación, se realiza tomando los bloques a procesar en el sentido de su lectura, es decir, de izquierda a derecha.
El alfabeto a utilizar se expresa en la siguiente imagen:
Por tanto, los caracteres utilizados en el alfabeto de Base64 son:
A, B, C, D, E, F, G, H, I, J, K,L, M, N, O,P, Q, R, S, T, U, V, W, X, Y, Z, a, b, c, d, e,f ,g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, /
Y en el orden descrito les corresponden los índices del 0 al 63 en un arreglo de 64 elementos. Para traducir de binario a Base64, se examina la secuencia binaria evaluando 6 bits a la vez; si el valor de los primeros 6 bits es 0, entonces se imprime la letra A; si es 1, entonces se imprime la letra B y así sucesivamente hasta completar la evaluación de todos los bits de la secuencia binaria evaluados de 6 en 6.
Ejemplo de Sello digital generado con un certificado de 2048 bits:
AM0PWKyhvpj1Pf7AJVzAAGjaYU0t6r5hjk0DOj+wISCSdA2LZj7jmnBKivivgU8J5svcto9kABfNm246HG2y8Q6YcQJmB6Dw2bUBoZfrPE54yP+S5MfPtCw5QhS948Pc91gJcLPrHmaRXINaEqq0mTGWr4aWSAZxcb9Dql9KnvLcXt30KISnbc2+4m9RtpsTPLk2joKFGxf8eejGL69vO8txtmLqioInFDhTPWQcIKMdUutUbREsSsQSfmOuoQdVBCCMY7SUK2ZtGDaCnshQSOVz/GHGfLQT4Qj0hetPtaDi60YPM5Mf3cekonBHb4jc2+FuCJW+JKCsnI7sJ4+iYg==
Naomí
Esta genial el articulo. Reciba un cordial saludo.