NOM-151

Sello de tiempo NOM-151

El sello de tiempo se puede solicitar de dos maneras:

  1. Incrustado dentro de un PDF: si se van a sellar documentos PDF recomendamos utilizar esta manera. El sello queda incrustado dentro de la metadata del documento y después se agrega una firma para que no se pueda modificar. Sirve como una manera de cerrar el documento y no se tienen que mantener dos archivos.

  2. Sello para cualquier tipo de archivo: La otra opción es generar el sello como un archivo independiente. Esto permite que se puedan generar sellos para cualquier tipo de archivo, como fotos, videos, docx, xlsx, etc.

Además de los métodos para obtener el sello de tiempo, están disponibles los métodos para validar el sello generado. La validación revisa que:

  1. El hash del documento corresponda al hash que se encuentra en el sello

  2. Que el status del sello sea válido

  3. Que la firma del sello sea válida

Estampilla incrustada dentro de un PDF

Generación

Para generar el sello e incrustarlo dentro de un PDF, solicitamos el binario del documento:

    const file = fs.readFileSync('./ejemplo.pdf');
    const response = await services.nom151Stamp(file)

La respuesta contiene la siguiente información:

{
    "status": "success" o "error",
    "document":"base64 del documento PDF",
    "timestampData":{
        "genTime":"fecha de generacion del sello",
        "hash":"hash que fue sellado",
        "status":"status contenido dentro de la respuesta de la TSA",
        "tsa":"nombre de la TSA que firmó el sello de tiempo"
    },
    "error":"si 'status' es 'error', contendra una descripción del error",
}

Validación

Después de obtener un documento sellado, se puede validar en cualquier momento. Este proceso extrae el sello del documento y lo valida, sólo acepta documentos con el sello de tiempo incrustado.

    const stampedFile = fs.readFileSync('./stampedFile.pdf');
    const validationResult = await services.nom151Validate(stampedFile);

La respuesta contiene la siguiente información:

{
    "status": "success" o "error",
    "document":"base64 del documento PDF",
    "timestamp":"el timestamp en base64 que se extrajo del documento PDF",
    "timestampData":{
        "genTime":"fecha de generacion del sello",
        "hash":"hash que fue sellado",
        "status":"status contenido dentro de la respuesta de la TSA",
        "tsa":"nombre de la TSA que firmó el sello de tiempo"
    },
    "error":"si 'status' es 'error', contendra una descripción del error",
}

Sello para cualquier tipo de PDF

Generación

Para generar un sello para cualquier tipo de archivo, enviamos el hash 256 en hexadecimal del archivo:

    // genera un hash256 de los datos para los que quieres
    // una estampilla de tiempo
    const hash = crypto.createHash('sha256')
      hash.update('datos a estampillar');

    // manda el hash como un string hexadecimal
     const response = await services.timestamp({
      hash: hash.digest('hex')
  })

La respuesta contiene la siguiente información:

{
    "status": "success" o "error",
    "timestamp":"el timestamp en base64 generado para el archivo",
    "timestampData":{
        "genTime":"fecha de generacion del sello",
        "hash":"hash que fue sellado",
        "status":"status contenido dentro de la respuesta de la TSA",
        "tsa":"nombre de la TSA que firmó el sello de tiempo"
    },
    "error":"si 'status' es 'error', contendra una descripción del error",
}

Validación

Después de obtener el sello, se puede validar en cualquier momento enviando el sello junto con el archivo original o el hash con el que se generó

    const validationResultFile = await services.timestampValidate({
        file: binaryFile, 
        timestamp: binaryTimestamp
    })

    const validationResultFile = await services.timestampValidate({
        hash: 'hexHash',
        timestamp: binaryTimestamp
    })

La respuesta para cualquiera de las dos opciones contendrá la siguiente información:

{
    "status": "success" o "error",
    "timestampData":{
        "genTime":"fecha de generacion del sello",
        "hash":"hash que fue sellado",
        "status":"status contenido dentro de la respuesta de la TSA",
        "tsa":"nombre de la TSA que firmó el sello de tiempo"
    },
    "error":"si 'status' es 'error', contendra una descripción del error",
}

Última actualización