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 来自 <keygen> 的 openssl_spki_verify() 示例

验证从 <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']))
{
// 如果为真,则来自 <keygen/> 的发送有效,您也可以测试质询
// test the challenge too
if(openssl_spki_verify($_POST['security']))
{
// 获取质询字符串
$challenge = openssl_spki_export_challenge($_POST['security']);

// 如果为真... 您没有试图欺骗它。
// 如果用户打开 2 个窗口以防止因“错误”而丢失数据或他只是按下“后退”按钮
// 并重新发送最后的数据...您可以使用类似的方法来处理它。
if($challenge == $_SESSION['lastForm'])
{
echo
'Ok, this one is valid.', '<br><br>';
}
else
{
echo
'Nice try... nice try...', '<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