当前位置: 首页 > 知识库问答 >
问题:

PHP Saml 2.0,无法验证哈希(摘要或签名)

燕涵容
2023-03-14

我需要你的帮助,找出我在验证哈希方面做错了什么。我将代码放在摘要中,这样就可以查看它,而无需进行大量滚动。

此处发送了一个类似的令牌示例:

https://gist.github.com/NoMan2000/3d3044e8d653a1d580ac#file-saml xml

我试图检查两个字段,DigestValue和SignatureValue。据我所知,DigestValue是通过查看应用的变换并应用DigestMethod中指定的哈希算法来计算的。

该散列是原始二进制输出的散列算法的Base64编码版本。

转换说“删除签名块中的所有内容,使用C14N转换字符串以规范化输出,并根据参考URI中给出的id计算哈希”:我是基于我在这里读到的内容:

http://www.w3.org/TR/xmldsig-core/#sec-TransformAlg

然而,抓取算法,使用哈希等不起作用。我总是没有通过检查。

https://gist.github.com/NoMan2000/3d3044e8d653a1d580ac#file-samlcontroller-php-L296

同样,每当我尝试验证SignatureValue时,我的印象是SignatureValue是使用SignatureMethod算法中指定的SSL算法由公钥加密的摘要值。

所以这一行代码应该可以工作:

<代码>$验证=openssl\u验证($digestValue,base64\u decode($signatureValue),$pubkeyid,$algo)

但verify始终返回0。当我阅读文档时,它是由二进制版本的哈希代码组成的字符串,加上公钥和算法。

我已经尝试了几十种显示的代码变体,但都没有成功。有人知道我做错了什么吗?

共有2个答案

丰智
2023-03-14

我同意米洛斯·托米奇的回答,但使用了OneLogin。代码基本相同:

$pubCert = '/path/to/crt/';
$doc = new DOMDocument();
$doc->loadXML($SAMLResponse); // What the server sends over.
$pubkeyid = openssl_x509_read("file://$pubCert");
$validate = OneLogin_Saml2_Utils::validateSign($doc, $pubkeyid);
云新知
2023-03-14

您可以尝试使用LightSAML。这是签名验证的示例http://www.lightsaml.com/LightSAML-Core/Cookbook/How-to-verify-signature-of-SAML-message/.

一旦反序列化SAML响应,签名验证本身就可以这样完成

// deserialize from XML ...
$response = new \LightSaml\Model\Protocol\Response();

// load IDP certificate
$key = \LightSaml\Credential\KeyHelper::createPublicKey(
    \LightSaml\Credential\X509Certificate::fromFile('idp.crt')
);

// validate the signature, will throw an Exception if invalid
$response->getSignature()->validate($key);
 类似资料:
  • 我正在编写一个Java web服务,它使用来自网络中一些客户端的iText对PDF文档进行签名。文档的签名正确,可以使用外部工具进行验证。然而,由于一些法律限制,为了将此文档存储在一个正式的文档存储库中,我必须提供来自签名的散列/摘要消息。 我已经尝试了几乎所有的方法来获得那个散列,但我能得到的最接近的方法是用下面的代码段以字符串的形式获得整个签名(证书+散列/摘要+时间戳)(请原谅字符串和[1]

  • Dropwizard是否也支持摘要验证?我只找到了基本的身份验证和OAuth。这方面的示例代码会很好。 null

  • 问题内容: 我正在编写一个Java网络服务,该网络服务从网络中的某些客户端使用iText对PDF文档进行签名。文档已正确签名,可以使用外部工具进行验证。但是,由于某些法律限制,为了将此文档存储在正式的文档库中,我必须提供签名中的哈希/摘要消息。 我已经尝试了几乎所有方法来获取该哈希,但是我可以获取的最接近的方法是使用此代码段将整个签名(CERT + HASH / DIGEST + TIMESTAM

  • 我使用以下代码使用PBKDF2对密码进行哈希: 如何验证身份验证的密码?看来我需要拿到用来哈希密码的盐。我怎么拿到?请注意,我没有使用单独的字段来存储哈希。数据库中只存储散列密码。

  • 我正在尝试使用Shiro对我正在构建的JSF Web应用程序进行身份验证和授权。不幸的是,我仍然有一些困难缠绕我的头如何把所有的东西放在一起。 我已经成功地(100%使用shiro.ini文件)将身份验证配置回存储测试凭据集的JDBC领域。当凭据以明文形式存储时,它对我来说非常有效。 我的最终目标是统一MySQL数据库中的现有凭证集。密码存储为SHA-256盐哈希。我花了一整天的时间阅读可用的文档

  • 我有一个关于计算PDF文档摘要以用于数字签名的快速问题(与我前面的一个问题有点相关,我试图弄清楚为什么您需要知道客户的证书以创建正确的摘要)。在Adobe关于PDF格式的文档中,指定了以下内容: 字节范围摘要应在文件中的一个字节范围内计算,该范围应由签名字典中的字节范围条目指示。这个范围应该是整个文件,包括签名字典,但不包括签名值本身(内容条目)。 因此,在这一点上,事情似乎相当简单,只需消化除/