DocuSign Хеширование Подписанные PDF-документы всегда дают различное хеш-значение - PullRequest
0 голосов
/ 05 декабря 2018

В настоящее время я пытаюсь хэшировать все документы заполненного конверта.Я сталкиваюсь с проблемой, когда всякий раз, когда я делаю вызов REST для GET Document, он возвращает уникальный в цифровом формате PDF.Я пытался удалить метаданные и водяные знаки PDF, но не могу детерминистически вычислить хэш PDF SHA256.Я включил свой короткий фрагмент кода ниже.Мне интересно, если DocuSign добавляет какие-то уникальные данные заголовка, которые меняют хеш моего PDF.Любая помощь будет очень ценится.Я также включил txt-файл, в котором регистрируется индекс разделителя EOF, который представляет фактические данные PDF, которые должны быть статическими при каждом вызове для получения документа.

Что меня смущает, так это то, что я могудля детерминированного извлечения индекса первого разделителя EOF, который представляет конец фактического PDF (исключая метаданные и водяной знак).Когда я продолжаю хешировать этот нарезанный буфер, он продолжает генерировать другое значение хеш-функции, из-за чего я полагаю, что первые 0 -> n байты, возвращаемые из вызова get document в DocuSign, отличаются при последующих вызовах.

Код:

exports.getDocuments = async (req, res) => {
  try {
    // Iterate through the list of documents provided and the result of this operation will be a collection [{url: '', data: '', hash: ''}, ...]
    let results = await Promise.all(req.body.docs.map(async (currDoc) => {
      const config = {headers: {'Authorization': req.body.headers.Authorization}}

      // Retrieve Document from DocuSign
      let documentResults = await axios.get(currDoc.config.url, config)
      // Get the Document Buffer up to the first EOF delimeter
      let documentBuffer = await getDocument(documentResults.data, 'binary', currDoc.config.url)

      return {
        url: currDoc.config.url,
        hash: crypto.createHash('sha256').update(documentBuffer).digest('hex') // TODO: Right now always different!!!
      }
    }))

    res.status(200).send(results)
  } catch (error) {
    console.error(error)
    res.status(500).send(error.message)
  }
}

function getDocument (data, dataType, url) {
  const documentBuffer = Buffer.from(data, dataType)
  const documentId = url.split('/').reverse()[0]
  const eofBuffer = Buffer.from('\n%%EOF', 'ascii')
  const documentEofBufferIdx = getAllIndexes(documentBuffer, eofBuffer)

  console.log(`DocumentID Buffer first index of id=${documentId}: ${documentEofBufferIdx[0]}`)
  console.log('All eof indexes found', documentEofBufferIdx)

  // We want to return the document up to the first EOF, EOFs 2 & 3 refer to the metadata and DocuSign watermark.
  return Promise.resolve(documentBuffer.slice(0, documentEofBufferIdx[0]))
}

// Iterate through the file and collect all of the EOF indexes.
function getAllIndexes (buf, eofBuf) {
  const indexes = []
  let i = -1
  while ((i = buf.indexOf(eofBuf, i + 1)) !== -1) {
    indexes.push(i + eofBuf.length)
  }
  return indexes
} 

1 Ответ

0 голосов
/ 06 декабря 2018

Когда вы загружаете документ из DocuSign, DocuSign подписывает его цифровой подписью во время извлечения документа.Используется стандартная цифровая подпись X.509.

Если вы откроете PDF в Adobe PDF reader, он покажет цифровую подпись.Подпись включает дату и время, когда она была подписана, это, вероятно, тот вариант, который вы видите.

Если вы понимаете формат PDF, вы можете извлечь документ из PDF без цифровой подписи DocuSign.Это не изменится, когда конверт достигнет статуса «завершено».

Каков ваш вариант использования?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...