簡體   English   中英

XML文件在C中的MD5實現

[英]MD5 implementation in C for a XML file

我需要實現MD5校驗和以驗證XML文件中的MD5校驗和,該文件包括所有XML標記,並且已從客戶端接收到。 接收到的MD5校驗和的長度為32個字節的十六進制數字。

在計算校驗和之前,我們需要在接收的XML文件中將MD5校驗和字段設置為0,並且我們必須獨立地計算和驗證接收的XML文件中的MD5校驗和值。

我們的應用程序是用C實現的。請協助我實現該方法。

謝謝

這直接取決於用於XML解析的庫。 但是,這很棘手,因為您無法將MD5嵌入XML文件本身,因為在將校驗和嵌入內部之后,除非僅對特定元素進行校驗和。 據我了解,您是獨立接收MD5的嗎? 它是根據整個文件還是僅根據標簽/內容計算的?

確切的解決方案取決於所使用的代碼。

根據您的評論,您需要執行以下步驟:

  • 加載xml文件(可能甚至是純文本),讀取MD5
  • 將文件中的MD5替換為零,將文件寫下(或更好地寫入內存)
  • 在純文件數據上運行MD5並將其與之前存儲的值進行比較

您應該使用MD5的公共領域實現,而不是編寫自己的實現。 聽說Colin Plumb的版本被廣泛使用。

不要重新發明輪子,請使用經過驗證的現有解決方案: http : //userpages.umbc.edu/~mabzug1/cs/md5/md5.html

順便說一句,這是我在Google搜索“ md5 c實現”時出現的第一個鏈接。

真討厭 建議的方法似乎暗示您需要將XML文檔解析為DOM樹之類的內容,找到MD5校驗和並將其存儲以備將來參考。 然后,您可以在重新序列化文檔並計算其MD5哈希值之前將校驗和替換為0。 所有這些聽起來都是可行的,但可能很棘手。 我看到的主要困難是,文檔的新序列化可能與原始序列不同,並且(與XML)無關(例如,在屬性值周圍使用單引號或雙引號,添加了換行符甚至是不同的編碼)導致哈希值不同。 如果您采用這種方式,則首先需要確保您的應用程序和用於創建文檔的過程都做出了相同的選擇。 對於此類問題,規范的XML是標准解決方案( http://www.w3.org/TR/xml-c14n )。

但是,我會做一些不同的事情。 運氣好的話,編寫正則表達式以在文件中定位MD5哈希並將其替換為0應該非常容易。在重新計算哈希之前,可以使用它來獲取哈希並在XML文件中將其替換為0。 這回避了解析,更改和重新序列化XML文檔的所有可能的問題。 為了說明這一點,我將假設哈希“ 33d4046bea07e89134aecfcaf7e73015”位於XML文件中,如下所示:

<docRoot xmlns='some-irrelevant-uri>
  <myData>Blar blar</myData>
  <myExtraData number='1'/>
  <docHash MD5='33d4046bea07e89134aecfcaf7e73015' />
  <evenMoreOfMyData number='34'/>
</docRoot>

(我將其稱為hash.xml),應將MD5替換為32個零(因此哈希是正確的),並在shell命令行上使用perl,md5和bash演示了該過程。 (鑒於存在正則表達式和哈希庫,希望將其轉換為C不會太困難。)

要解決該問題,首先需要能夠找到文件中的哈希:

perl -p -e'if (m#<docHash.+MD5="([a-fA-F0-9]{32})#) {$_ = "$1\n"} else {$_ = ""}' hash.xml 

(這是通過查找docHash元素的MD5屬性的開頭,允許其他可能的屬性,然后獲取接下來的32個十六進制字符來工作的。如果找到它們,它將在$ _變量中使它們變笨,如果沒有設置的話) $ _為空,然后每行打印$ _的值。這將導致打印字符串“ 33d4046bea07e89134aecfcaf7e73015”。)

然后,您需要使用替換為零的文件來計算文件的哈希值:

perl -p -e's#(<docHash.+MD5=)"([a-fA-F0-9]{32})#$1"000000000000000000000000000000#' hash.xml | md5

(其中的正則表達式幾乎相同,但是這一次十六進制字符被零替換,並且打印了整個文件。然后,通過將結果通過md5哈希程序傳遞給管道,來計算其MD5。 bash給出:

if [ `perl -p -e'if (m#<docHash.+MD5="([a-fA-F0-9]{32})#) {$_ = "$1\n"} else {$_ = ""}' hash.xml` = `perl -p -e's#(<docHash.+MD5=)"([a-fA-F0-9]{32})#$1"000000000000000000000000000000#' hash.xml | md5` ] ; then echo OK; else echo ERROR; fi

它執行這兩個小命令,比較輸出,如果輸出匹配,則輸出“ OK”,否則輸出“ ERROR”。 顯然,這只是一個簡單的原型,並且使用錯誤的語言,我認為它說明了最直接的解決方案。

順便說一句,為什么將哈希放在XML文檔中? 據我所知,與在邊通道中傳遞哈希值相比,它沒有任何優勢(即使是像名為documentname.md5的第二個文件中那樣簡單的東西),也使哈希驗證更加困難。

查看這些示例,了解如何在.net中使用XMLDSIG標准。

您也許應該考慮更改保留空白的設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM