用C 實現pdf檔案的完整性驗證

2021-09-23 21:15:01 字數 1522 閱讀 5421

現在對檔案的完整性驗證,防止檔案被篡改的技術已經比較成熟,一般使用數字簽名,數字水印等,最近我在乙個專案中也遇到了防篡改的需求。該專案要求使用者將原始發票用專門的掃瞄程式掃瞄成pdf檔案,然後將該pdf檔案傳到伺服器上,在上傳的同時必須要驗證這個pdf是沒有被手工修改過的。我剛一接觸到這個需求想到的就是使用數字水印,要不然就直接使用pdf的數字簽名功能,不過這些方法都感覺比較比較複雜,一大堆的英文文件也沒有心思去研究,於是琢磨了半天,寫了乙個簡化版的數字水印程式,實現了pdf檔案完整性驗證。

驗證的基本思路是:

對檔案全部內容計算其md5值,這樣無論使用者修改了檔案的任何乙個地方,那麼生成的md5的是完全不一樣的,我們可以將這個md5寫到檔案的乙個隱藏區,一般二進位制檔案格式都有檔案頭和檔案體部分,而檔案頭是使用者看不到的,一般也會預留一部分位元組用於以後擴充套件,或可以在檔案頭寫入特殊標記的資料。於是研究了一下pdf檔案的格式,試著往其第10個位元組插入了md5值,結果檔案雖然可以使用,但是每次開啟的時候都會提示「檔案修復」。原來是寫在頭上面的內容將pdf檔案的位元組數和檔案中物件的位址改變了,導致了檔案錯誤,原因找到了那麼解決辦法也就有了,為了不改變pdf檔案中物件的位址,那麼我們將這個md5寫在檔案尾不就可以了嘛!於是在客戶端(掃瞄程式)將掃瞄出的pdf檔案流計算md5值,然後將該檔案流和md5值一起寫到硬碟上,形成乙個新增了md5值的pdf檔案。檔案可以正常開啟和使用,而且使用者也不會看到我們新增的這個md5值。

在伺服器端,我們將上傳上來的檔案流除了最後32個位元組以為的部分計算md5值(這兒取32個位元組是因為最後這32位元組是我們寫的md5),將前面部分算出的md5和最後32個位元組的md5進行比較,如果一樣那麼說明這個檔案從掃瞄程式生成以後沒有被人為篡改過,否則說明該檔案要麼不是用我們這個掃瞄程式生成的要麼就是被篡改了。這樣驗證通過以後我們才將該檔案流寫到伺服器硬碟上。

1public

class

md52

31catch

(exception e)

3235

36///37

///對給定路徑的檔案進行驗證

38///39

///40

///是否加了標籤或是否標籤值與內容值一致

41public

static

bool

check(

string

path,

string

key)

4257

catch

5863

64private

static

string

md5buffer(

byte

pdffile, 

intindex, 

intcount)

6573

private

static

string

md5string(

string

str)

7479

以上**不僅僅只適用於pdf檔案,對於其他一些格式也可以用,這主要是取決於檔案的格式規範。關於pdf,官方有相關文件,不過大家覺得麻煩可以看看這篇文章:

檔案完整性hash驗證demo(python指令碼)

乙個簡單的檔案完整性hash驗證指令碼 usr bin env python coding utf 8 import os import hashlib import json 目錄所有檔案列表 path list 靜態檔案可以不做hash效驗 使用檔案迭代器,迴圈獲取資料 def md5sum f...

Dex檔案的完整性校驗

classes.dex 在 android 系統上基本負責完成所有的邏輯業務,因此很多針對android 應用程式的篡改都是針對 classes.dex 檔案的。在 apk 的自我保護上,也可以考慮對 classes.dex檔案進行完整性校驗,簡單的可以通過 crc 校驗完成,也可以檢查 hash ...

如何使用pgp證書來驗證檔案的完整性

pgp證書是這樣生成的 個人理解 1.現找到檔案的hash碼,類似於md5 2.用私鑰對其進行加密。3.將公鑰暴露到 上。4.將證書暴露到 上。5.終端使用者匯入公鑰到本地。6.終端使用者使用公鑰解密證書,拿出hash資訊來驗證檔案的完整性。下面是驗證檔案 nginx 1.6.2.zip的過程 wa...