PHP Conference Japan 2024

openssl_spki_verify

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

openssl_spki_verify驗證已簽署的公鑰和挑戰

說明

openssl_spki_verify(字串 $spki): 布林值

驗證提供的已簽署公鑰和挑戰

參數

spki

預期有效的已簽署公鑰和挑戰

回傳值

成功時返回 true,失敗時返回 false

錯誤/例外

如果透過 spki 參數傳遞了無效的引數,則會發出 E_WARNING 等級的錯誤。

範例

範例 #1 openssl_spki_verify() 範例

驗證現有的已簽署公鑰和挑戰字串

<?php
$pkey
= openssl_pkey_new('secret password');
$spkac = openssl_spki_new($pkey, 'challenge string');

if (
openssl_spki_verify(preg_replace('/SPKAC=/', '', $spkac))) {
echo
$spkac;
} else {
echo
"SPKAC 驗證失敗";
}
?>

範例 #2 openssl_spki_verify() 來自 <keygen> 的範例

驗證從 <keygen> 元素發出的現有已簽署公鑰和挑戰字串

<?php
if (openssl_spki_verify(preg_replace('/SPKAC=/', '', $_POST['spkac']))) {
echo
$spkac;
} else {
echo
"SPKAC 驗證失敗";
}
?>
<keygen name="spkac" challenge="challenge string" keytype="RSA">

參見

新增註釋

使用者貢獻的註釋 2 則註釋

carloshlfzanon at gmail dot com
7 年前
這些 openssl_spki_* 函式對於 HTML5 中的 <keygen/> 標籤非常有用。

範例

<?php
session_start
();

// 表單已提交... (?)
if(isset($_POST['security']))
{
// 如果為 true,則來自 <keygen/> 的傳送有效,您也可以
// 測試挑戰
if(openssl_spki_verify($_POST['security']))
{
// 取得挑戰字串
$challenge = openssl_spki_export_challenge($_POST['security']);

// 如果為 true... 您沒有試圖欺騙它。
// 如果使用者開啟兩個視窗以防止因「錯誤」或他只是按下「返回」按鈕而遺失資料
// 並重新傳送最後的資料... 您可以使用類似的方法來處理它。
if($challenge == $_SESSION['lastForm'])
{
echo
'好的,這個有效。', '<br><br>';
}
else
{
echo
'想得美... 想得美...', '<br><br>';
}
}

}

// 如果您開啟兩個視窗,挑戰將不匹配!
$_SESSION['lastForm'] = hash('md5', microtime(true));

?>

<!DOCTYPE html>
<html>
<body>

<form action="/index.php" method="post">
加密: <keygen name="security" keytype="rsa" challenge="<?php echo $_SESSION['lastForm']; ?>"/>
<input type="submit">
</form>

</body>
</html>
neat at neato dot com
4 年前
挑戰並非是如何驗證「欺騙」。它被用作部分不可否認性方法。

其概念是挑戰可以從 'keygen' 元素提供的 base64 編碼 ASN.1 PKCS#1 位元中提取。

SPKAC 是一種 CSR 形式,如果包含正確的資訊,例如 commonName、emailAddress、countryName、stateOrProvinceName、localityName 等,則可以產生簽名的 x509 並提供給請求者。

然後,這將安裝在瀏覽器中,如果 Web 伺服器配置為接受用戶端 x509 憑證,它將用於代替密碼進行身份驗證。

建議使用「挑戰」作為一種不可否認性形式,以防其他人使用您的鍵盤。如果應用程式需要,它會提示您輸入挑戰,並將其與初始 SPKAC 過程中儲存的雜湊版本進行比較。

希望這能有所幫助。
To Top