我正在尝试从外部远程服务对文档进行签名。签署过程分两个阶段进行。远程服务在第一阶段期待base64编码的散列,并在身份验证后发出令牌。在第二阶段,我们将使用接收到的令牌再次传递相同的散列并获得base64签名的散列。我在这里附上签名错误的文件。文件
如果有人可以分析它并指导我评估无效签名背后的原因。我正在使用iText7
执行与pdf相关的操作。
更新
根据反馈,我做了一些更正。文档现在正在更改。已更改的文档
本节重点介绍原始示例文件,文档-2021 05-01T170114.722.pdf。
PDF中有两个明显的问题。由于您不分享您的关键代码,我只能猜测原因。
您共享的111794字节长的文件实际上是两个PDF的串联,首先是准备签名的PDF,签名容器占位符中只有00
秒,然后是同一文件,其中包含其他内容。两个 PDF 中的每一个的长度正好为 55897 字节。
这种情况的一个典型原因是使用文件流进行输出,该文件流是通过文件模式< code>Append而不是< code>Create打开的,这可能与使用相同的文件作为输入和输出相结合。
您使用子筛选器adbe.pkcs7.detached创建了签名。这意味着嵌入到签名占位符中的数据必须是CMS签名容器(CMS是PKCS#7的继承者)。但是,在您的签名文件中,只有一个裸签名值,没有签名容器。
这种情况的典型原因是在签名期间使用了< code > IExternalSignatureContainer 实现(通常在< code > pdf signer . sign deferred 或< code > pdf signer . signexternalcontainer 的上下文中),其< code>sign方法错误地返回了一个裸签名值,而不是签名容器。
您描述的用例,即使用需要哈希并返回签名哈希的签名服务,听起来您的服务确实只返回一个裸签名值,没有签名容器。
一般来说,这是一种典型的情况,其中不使用延迟签名,而是将< code > pdf signer . sign detached 与< code>IExternalSignature实现一起使用,该实现的< code>sign方法首先对其参数字节数组进行哈希处理,然后将哈希值传递给服务并检索签名的哈希,最后返回签名的哈希。
本节重点介绍您第一次更新的示例文件,文档-2021 05-03T200650.926.pdf。
正如您所说,您已对第一个文件进行了更正,以解决上面列出的问题。在您的第二个文件中发现的问题是详细的。尽管如此,您仍然没有共享关键代码,因此我仍然只能猜测问题的原因。
在签名中使用SHA256哈希算法。
< code>messageDigest签名属性具有以下值:
80FE8AC2DE959A2C791A72A68176EB312D77BD201F8D07CD5A42CC9A4370AAFB
但这与PDF的签名字节的哈希不匹配
83134B9C1C7CAE9E4FB0A1FCB37A30A6783F81AF70F6EF4B68865E83C2E11717
显然,您的哈希计算例程中有一个错误,或者您只是哈希了错误的数据。由于您没有显示您的代码,我无法判断您做错了什么。
您的签名字节对哈希值进行签名
80FE8AC2DE959A2C791A72A68176EB312D77BD201F8D07CD5A42CC9A4370AAFB
但是这与签名属性的散列不匹配
9C0D3D2249E69AFA1078F03159332C439B8407A526CBA77C9E9B2701A7EE8131
显然,您的哈希计算例程中有一个错误,或者您只是哈希了错误的数据。由于您没有显示您的代码,我无法判断您做错了什么。
唯一明显的是,您在两种情况下都声明了相同的哈希值。但是,这些哈希值重合是极不可信的。
我想创建一个签名并使用openssl验证它。我想有我的签名的十六进制输出。 这是我的密码 我得到这个错误: 如果我在创建签名的过程中删除了-hex,它就可以工作了。
问题内容: 我正在尝试以编程方式验证jar文件是否未被明显篡改。我有2个要防止的用例。1)修改现有类2)在罐子中添加新类 我使用jarsigner签名了罐子。当我用jarsigner验证以上两种情况之一时,它的工作方式就与我期望的一样。 当我尝试使用如何以编程方式验证用jarsigner签名的jar 或如何通过自签名的jar验证签名中的示例以编程方式进行操作时 ?但是,我没有任何SecurityE
问题内容: 我正在使用node.js request.js到达api。我收到这个错误 [错误:UNABLE_TO_VERIFY_LEAF_SIGNATURE] 我所有的凭据都是准确有效的,并且服务器还不错。我对邮递员提出了同样的要求。 此代码仅在可执行脚本ex中运行。,那是为什么?是否需要在服务器上运行? 问题答案: 注意 :以下情况很危险,并且将允许在客户端和服务器之间截取和修改API内容。 这
我正在尝试在python中使用ECDSA验证比特币签名,但发现它非常困难,许多尝试已经失败了。 参数: 注意:我已经根据ECDSA的要求将签名从base64转换为hexstring。每当我试图验证它时,它会说: 预期64字节签名(128十六进制字符串),提供了65字节签名(130十六进制字符串) 我查看了许多关于ECDSA的stackoverflow问题,但没有一个答案与我的qs 100%相关。感
我已经添加了razorpay测试版本和支付流程工程,但当我试图验证时,我得到以下错误 通知:未定义的索引:razorpay_order_id在C:\用户\阿明\文档\NetBeansProjects\OLX\付款\verify.php行24您的付款失败 Razorpay错误:传递的签名无效 我在这里遵循了代码结构形式https://github.com/razorpay/razorpay-php-