PHPでWin/Linux間CHECKSUM突合

備忘録です。


Windowsではファイル チェックサム整合性検証のために、fciv.exeというユーティリティが提供されているそうです。とあるファイル授受をする案件で、MD5チェックサムで整合性検証をすることになったのですが、来たチェックサムファイルがXML形式でびっくり。調べたところ、このfciv.exeを利用してXMLデータベース形式でファイル名とチェックサムを格納しているらしい。


参考URL:http://support.microsoft.com/kb/841290/ja ※ちなみにこのページはHTMLタグが妙なことになっていてタグが直接表示されているのか、パラメーターオプションなのかわからない所がたくさんあります。(/_;) よくよく見返すと翻訳も相当おかしなことに。。。


a.txtのMD5チェックサムXMLデータベースに追加するには以下のコマンドらしい。
C:\WINDOWS\system32>fciv -add a.txt -XML c:\temp\a.xml
出来上がるファイル(a.xml)は以下のような感じです。

<?XML version="1.0" encoding="utf-8"?>
<FCIV>
<FILE_ENTRY><name>a.txt</name><MD5>bL/ZGbqnyeA8hHGuTY+LsA==</MD5></FILE_ENTRY></FCIV>


さて、これをLinux(RHEL)側でごにょごにょするわけですが、簡単な文字列比較なので、大好きなPHPでやっつけてみました。もっとスマートな方法があればぜひご指摘ください。

/**
 * FCIVチェックサム連携
 *
 * FCIVで作られたXML内のチェックサムを取り出して比較する。
 *
 * @param string $file 対象ファイルパス
 * @param string $xmld FCIVのXMLファイルパス
 * @return boolean (チェックサムが一致したらTRUE)
 */
function checkFcivxml ($file,$xmld) {
    if (!is_file($file) || !is_file($xmld)) { return FALSE; }
    libxml_use_internal_errors(true);
    try {
        $xml = new SimpleXMLElement(file_get_contents($xmld));
    } catch (Exception $e) {
        return FALSE;
    }
    return (md5(file_get_contents($file)) === bin2hex(base64_decode($xml->FILE_ENTRY->MD5)));
}


実際の利用に際しては読み込むファイルのファイルサイズなど気をつけなくてはいけない点は多々ありますのでご注意ください。