簡體   English   中英

PHP-閱讀可執行文件的數字簽名並驗證作者,如何使用PHP驗證可執行文件的數字簽名

[英]PHP - Read Digital Signature of an Executable and verify Author, How can I validate digital signatures of an Executable using PHP

我們有一些可執行文件文件(安裝程序)上傳到我們的Web服務器。 這些安裝程序經過數字簽名-Microsoft Authenticode,帶有SHA1和SHA256。 標准二進制代碼簽名-從桌面。

我們將此安裝程序上傳到我們的Web服務器。

我們希望在將安裝程序提供給最終用戶之前對其進行驗證。 這是一個驗證過程,我們要驗證可執行文件/安裝程序是否已調整。 如果是這樣,可執行文件將沒有我們的數字簽名,因此我們不希望最終用戶下載它。

我已經嘗試過openssl_get_publickey和openssl_verif但沒有運氣。 當我在帶有OpenSSL的Windows操作系統上使用certificate.pem和sign-ID.bin時,我可以驗證安裝程序的數字簽名。

我不是必須使用openssl_verif,如果有任何方法可以驗證文件的屬性並在數字簽名中檢查作者,則可以將作者名稱與期望值進行比較。

以下是我正在使用的php代碼。

// fetch certificate from file and ready it
$fp = fopen("/mypath/certificate.pem", "r");
$cert = fread($fp, 8192);
fclose($fp);

$pubkeyid = openssl_get_publickey($cert);

$fp = fopen("/mypath/sign-ID.bin", "r");
$cert = fread($fp, 8192);
fclose($fp);

$signature = $cert;


$fp = fopen($path, "r");
$cert = fread($fp, 8192);
fclose($fp);
$datapath=$cert;

// state whether signature is okay or not
// use the certificate, not the public key
//$ok = openssl_verify($datapath, $signature, $pubkeyid,  OPENSSL_ALGO_SHA256); tried both sha 256 and sha1
$ok = openssl_verify($datapath, $signature, $pubkeyid,  OPENSSL_ALGO_SHA1);


$error = "";

while ($msg = openssl_error_string() !== false) {
    $error .= $msg.'<br />';
}

if (!empty($error)) {
    echo $error; // 1
}

if ($ok == 1) {
    echo "good";
} elseif ($ok == 0) {
    echo "bad";
} else {
    echo "ugly, error checking signature";
}

如果我理解正確,則您具有SHA1 / SHA256哈希,並希望查看文件是否與此哈希匹配。

有一些命令行工具可用於此目的。 您可以使用exec()或類似的方法,然后將輸出與您擁有的哈希進行比較:

$actualHash = exec(sprintf("sha1sum %s", $filename));
if ($expectedHash !== trim($actualHash)) {
    throw new Exception();
}

顯然,這取決於在服務器上安裝了sha1sum ,並且生成的輸出僅是哈希值。 如果有一些免責聲明,例如Microsoft Integrity Check Tool輸出(如果我沒記錯的話),則可能必須$actualHash exec輸出中提取$actualHash

比較內容哈希的另一種方法是讀取文件,然后將字符串傳遞給php的哈希函數。

$content = file_get_contents($filename);
$actualHash = sha1($content);
// ... Do comparison

編碼可能會帶來麻煩,但理論上應該會產生相同的輸出。 如果您要優先選擇,我寧願從經過驗證的工具中獲取輸出,然后使用后一種方法。

暫無
暫無

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

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