DocuSign哈希签名的PDF文档始终会产生不同的哈希值

时间:2018-12-05 19:29:11

标签: docusignapi

我目前正在尝试散列完整信封的所有文档。我遇到一个问题,每当我对GET Document进行REST调用时,它都会返回一个数字唯一的PDF。我已经剥离了PDF的元数据和水印,但无法确定性地计算PDF SHA256哈希。我在下面包括了我的简短代码段。我想知道DocuSign是否在添加一些唯一的标头数据,这些数据正在更改PDF的哈希值。任何帮助将不胜感激。我还提供了一个txt文件,该文件记录了EOF分隔符的索引,该索引代表实际的PDF数据,该数据在每次获取文档的调用中都应该是静态的。

让我感到困惑的是,我能够确定地检索第一个EOF分隔符的索引,该索引代表实际PDF的结尾(不包括metatdata和水印)。当我继续对切片的缓冲区进行哈希处理时,它将继续产生不同的哈希值,这使我相信,从get文档调用返回到DocuSign的前0 -> n个字节在后续调用中是不同的。

代码:

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 :(得分:0)

从DocuSign下载文档时,DocuSign在检索文档时对其进行数字签名。使用标准的X.509数字签名。

如果在Adobe PDF阅读器中打开PDF,它将显示数字信号。签名包括签名的日期时间,可能是您看到的变化。

如果您了解PDF格式,则可以在没有DocuSign数字签名的情况下从PDF中拉出文档。信封达到“完成”状态后,这种情况就不会改变。

您的用例是什么?