- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究将应用程序从作为默认 PKCS#7 SignedData 摘要算法的 SHA1 升级到更强的摘要(例如 SHA256),以保留不支持 SHA1 以外的摘要算法的签名验证器的向后兼容性。我想检查我对 PKCS#7 格式和可用选项的理解。
我想做的是使用 SHA1 和 SHA256(或更一般地说,一组摘要算法)来摘要消息内容,以便旧应用程序可以继续通过 SHA1 进行验证,而升级的应用程序可以开始通过 SHA256 进行验证(更一般地说,提供最强的摘要),忽略较弱的算法。 [如果有更好的方法,请告诉我。]
看来在 PKCS#7 标准中,提供多个摘要的唯一方法是提供多个 SignerInfo,每个摘要算法对应一个。不幸的是,这似乎会导致安全性的净下降,因为攻击者能够使用最弱的摘要算法剥离除 SignerInfo 之外的所有内容,而仅靠该摘要算法仍将形成有效的签名。这种理解正确吗?
如果是这样,我的想法是在 SignerInfo 的authentiatedAttributes 字段中使用自定义属性,为附加摘要算法提供附加消息摘要(将 SHA1 保留为“默认”算法以实现向后兼容性)。由于该字段作为单个 block 进行身份验证,因此可以防止上述攻击。这看起来是一个可行的方法吗?有没有办法在不超出 PKCS 标准的情况下完成此任务或类似的任务?
最佳答案
是的,你说得对,在当前CMS RFC 中提到了消息摘要属性
The SignedAttributes in a signerInfoMUST include only one instance of the message-digest attribute.Similarly, the AuthAttributes in an AuthenticatedData MUST includeonly one instance of the message-digest attribute.
因此,使用标准签名属性提供多个消息摘要值的唯一方法是提供多个签名信息。
是的,任何安全系统的强度都取决于其最薄弱的环节,因此理论上,如果您仍然接受 SHA-1,那么通过使用 SHA-256 添加 SignedInfo 将不会获得任何好处 - 正如您所说,更强的签名始终可以被剥夺。
您的具有自定义属性的方案有点难以破解 - 但仍然存在可以攻击的 SHA-1 哈希。它不再像剥离属性那么简单 - 因为它被签名覆盖了。但是:
还有摘要算法,用于摘要签名属性,作为最终签名值的基础。你打算在那里用什么? SHA-256 还是 SHA-1?如果是 SHA-1,那么您将处于与之前相同的情况:
如果我可以产生 SHA-1 冲突,那么我会剥离您的自定义 SHA-256 属性并伪造 SHA-1 属性,以便签名的最终 SHA-1 摘要再次相加。这表明,只有当签名摘要算法也是 SHA-256 时,安全性才会有所提高,但我猜这是没有选择的,因为您希望保持向后兼容。
针对您的情况,我建议始终使用 SHA-1,但应用 RFC 3161 - 符合签名的时间戳作为未签名的属性。这些时间戳实际上是它们自己的签名。好处是您可以使用 SHA-256 作为消息印记,并且时间戳服务器通常使用您提供的相同摘要算法应用其签名。然后拒绝任何不包含此类时间戳或仅包含消息印记/签名摘要算法弱于 SHA-256 的时间戳的签名。
这个解决方案有什么好处?您的遗留应用程序应该检查是否存在未签名的时间戳属性以及是否使用了强摘要,但否则忽略它们并继续像以前一样验证签名。另一方面,新的应用程序将验证签名,但也会验证时间戳。由于时间戳签名“覆盖”了签名值,攻击者不再能够伪造签名。尽管签名使用 SHA-1 作为摘要值,但攻击者也必须能够破解更强的时间戳摘要。
时间戳的另一个好处是您可以将生成日期与签名相关联 - 您可以安全地声明签名是在时间戳时间之前生成的。因此,即使签名证书被撤销,借助时间戳,您仍然可以根据证书被撤销的时间精确地决定是拒绝还是接受签名。如果证书在时间戳之后被撤销,那么如果证书在时间戳时间之前被撤销,您可以接受签名(添加安全裕度(又名“宽限期”) - 信息发布需要一些时间)那么你想拒绝签名。
时间戳的最后一个好处是,如果某些算法变得很弱,您可以随着时间的推移更新它们。例如,您可以使用最新算法每 5-10 年应用一个新时间戳,并让新时间戳覆盖所有旧签名(包括旧时间戳)。这样,较弱的算法就会被更新、更强的时间戳签名覆盖。看看CAdES (还有一个 RFC ,但现在已经过时了),它基于 CMS 并尝试应用这些策略来提供 CMS 签名的长期归档。
关于cryptography - PKCS#7 SignedData 和多种摘要算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7099514/
常用的 PKCS 标准有什么用:PKCS#7、PKCS#10 和 PKCS#12? 最佳答案 PKCS#7 允许您使用 X.509 证书对通用数据进行签名和加密。 PKCS#7 格式也可用于存储一个或
我想知道当使用 AES-128-CBC 时,openssl 如何处理可被 8 个字节整除的消息。 openssl 如何检测到没有要删除的填充(PKCS#5/PKCS#7)?特别是当消息以 ASCII
我正在阅读 PKCS 11 文档,但我无法清楚地理解 key 的 CKA_SENSITIVE 属性是什么意思。 更常见的是:我在哪里可以阅读属性描述? 最佳答案 引自 PKCS#11 spec v2.
我想寻求有关使用 cryptography.hazmat.primitives.padding.PKCS7 的帮助Python 类。 解密后,我得到字符串45394700000019770808080
我知道 PKCS#7 = 证书 + 可选原始数据 + PKCS#1 格式的签名 我需要从 PKCS#7 签名中提取 PKCS#1 如何在 C# 中执行此操作。我可以用充气城堡来做这个吗,这是我的实现I
我希望能够使用带有 aws golang SDK 的 AWS SNS 发送 iOS APNS 推送通知。我按照以下说明创建了一个 p12 文件:https://support-aws.s3.amazo
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
我正在开发一个移动应用程序,它必须验证它收到的一些签名。我拥有我需要的一切——输入数据、公钥和签名。但有一个问题。我使用方法 SHA256withRSA 进行签名验证,其中包含以下几行代码来验证签名:
我有一个 PKCS#5 加密的 PKCS#8 RSA 私钥存储在一个磁盘文件中(最初由 SSLPlus 生成,大约在 1997 年),例如: -----BEGIN ENCRYPTED PRIVATE
是否可以将 PKCS#8 编码的 RSA 私钥转换为 PKCS#1?我知道这可以通过 openssl 轻松完成,但是可以用 Java 完成吗? 最佳答案 使用 BouncyCaSTLe 1.50 Pr
我正在为 Android 实现 Jscep。最初,我尝试了 Jscep for java,效果很好。现在在 Android 中,我使用 SpongyCaSTLe 而不是 BouncyCaSTLe。现在
我正在尝试在 SafeNet HSM 中生成一个 RSA key 对。我为私钥和公钥复制了 PKCS11 中指定的示例模板。当我生成 key 对时,一切正常。但是,当我为私钥指定以下属性值时,C_Ge
密码学在信息安全中扮演着至关重要的角色。为了保护敏感信息、数字身份和网络通信的安全性,密码设备(如硬件安全模块HSM)与应用程序之间的安全通信和互操作性变得至关重要。PKCS#11(Public-K
这玩意折腾了一天,有个老外的代码,公钥用了PKCS#1,私钥用了PKCS#8。调用了不同的API,而我的全是生成的PKCS#8,后面查阅了大量资料和长时间调试程序,才发现了问题,在此记录下。 用Ope
PKCS#12是一种将私钥与其对应的 X.509 证书合并为标准化的单一文件格式的便捷方式。然而,该规范于 1999 年由 RSALabs 发布,并且仅使用 RC4、RC2 和 TripleDES 进
我正在尝试使用 PKCS#7 进行签名和验证签名。我正在阅读《beginning cryptography with java》这本书。我已经编写了示例代码来签名和验证。当我尝试附加签名并将其写入文件
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 4年前关闭。 Improve this qu
使用java加密、签名、解密、验证签名需要遵循哪些步骤? 使用 PKCS#7 算法, java keystore 有什么用?关于 PKCS#7。 最佳答案 第 1 步 使用 keytool 实用程序生
我在 iPhone 上使用这个 OpenSSL 代码生成一个 PKCS#12 文件,给定证书/私钥的一些数据。我能够验证此 PKCS#12 在 OpenSSL 上是否可解析,因为当我在代码中检查它时它
我实际上正在研究一个应该从 PKCS7 mime 加密消息中提取 RecipientInfo 的函数。我想这样做的原因是,我想获取邮件加密的所有邮件地址(或至少是 keyids/指纹)。 嗯 - 我尝
我是一名优秀的程序员,十分优秀!