You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成内含自身SHA256哈希值的PDF文档?

实现自哈希匹配PDF的NodeJS方案

要生成一份PDF文档,使其内容中嵌入的SHA256值与整个文件的SHA256哈希完全一致,本质是构造自指哈希文档。以下是基于pdf-lib和NodeJS内置crypto模块的实现方案:

依赖安装

首先安装所需库:

npm install pdf-lib

核心实现代码

const { PDFDocument, StandardFonts } = require('pdf-lib');
const crypto = require('crypto');
const fs = require('fs').promises;

async function generateSelfMatchingHashPDF(outputFilePath) {
    // 循环尝试生成符合条件的PDF
    while (true) {
        // 1. 创建临时PDF,嵌入随机生成的哈希值作为尝试项
        const tempHash = crypto.randomBytes(32).toString('hex');
        const pdfDoc = await PDFDocument.create();
        const font = await pdfDoc.embedFont(StandardFonts.Helvetica);
        const page = pdfDoc.addPage([600, 400]);
        
        // 在PDF中写入哈希值
        page.drawText(`Document SHA256: ${tempHash}`, {
            x: 50,
            y: 350,
            size: 16,
            font: font,
        });

        // 2. 生成PDF字节并计算其实际哈希
        const pdfBytes = await pdfDoc.save();
        const actualHash = crypto.createHash('sha256').update(pdfBytes).digest('hex');

        // 3. 检查嵌入的哈希是否与实际文件哈希一致
        if (actualHash === tempHash) {
            await fs.writeFile(outputFilePath, pdfBytes);
            console.log(`成功生成PDF:${outputFilePath}`);
            console.log(`匹配的SHA256哈希:${actualHash}`);
            break;
        }

        console.log(`尝试哈希 ${tempHash} 不匹配,重试中...`);
    }
}

// 调用生成函数
generateSelfMatchingHashPDF('self-matching-hash.pdf');

逻辑说明

  1. 循环尝试机制:每次生成包含随机哈希值的PDF,计算该文件的实际SHA256哈希;若嵌入的哈希与实际文件哈希一致,即完成目标。
  2. 随机性保证:利用crypto.randomBytes生成随机初始哈希,确保每次尝试的内容差异,基于概率学,循环尝试最终会命中符合条件的哈希。
  3. PDF编辑:借助pdf-lib库快速创建PDF并写入文本,操作简洁且兼容性强。

优化建议

  • 若循环效率偏低,可在PDF中添加额外可变隐藏内容(如页面底部的随机字符串),增加每次尝试的内容差异,加快命中速度。
  • 若需修改现有PDF而非从头创建,只需调整逻辑:读取目标PDF,定位需替换哈希的文本位置,替换后重复哈希校验流程即可。

内容的提问来源于stack exchange,提问作者Adrian Rosca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 03:34:58