【问题标题】:Bouncy Castle : Detached Enveloped Signature Changes at Every RunBouncy Castle:每次运行时分离的信封签名更改
【发布时间】:2014-03-19 17:06:49
【问题描述】:

我正在关注generating and verifying digital signature 的帖子。签名数据在所有运行中保持不变,但分离信封签名在每次运行时都不同。相同的文本如何生成不同的分离信封签名?

【问题讨论】:

  • 这种行为是设计使然,因为那里有随机部分。
  • CMS 签名容器中的签名通常包含签名的签名时间属性。这个签名时间显然会随着每次运行而变化,并且(它是一个签名属性)签名也是如此。话虽如此,您引用的帖子看起来有点可疑:它首先使用signature 对一些文本进行签名,然后将生成的签名字节包装在使用ContentSigner sha1Signer 签名的CMSTypedData msg 中。这样的重复签名很可能没有意义。

标签: java digital-signature bouncycastle


【解决方案1】:

为了让 cmets 成为答案……

同一私钥对同一数据的签名可能不同的主要原因有两个。

签名算法引起的变化

某些签名算法,首先是DSAECDSA,明确地将签名创建基于随机选择的值k。这种“随机性”是必需的,随机签名值的熵、保密性和唯一性 k 至关重要。违反这三个要求中的任何一个都可以将整个私钥泄露给攻击者,这一点非常重要。两次使用相同的值(即使对 k 保密),使用可预测的值,或者在几个签名中的每一个中泄露 k 的几位,都足以破坏算法。该要求可以通过实际随机的 k 或以确定性方式构建的 k 来满足,这也保证了熵、保密性和唯一性,参见。 RFC 6967.

不过,OP 指的是使用RSA 的代码。该算法不需要这样的随机参数(即使填充方案可能包含随机性)。

签名属性引起的变化

变化的另一个原因是签名数据不仅仅包含文档数据。

在谈论“签名”时,人们通常不仅仅指签名过程字节数组输出,而是指符合CMS标准的签名容器。

这样的容器中可能有多个单独的签名,每个签名都可能有许多未签名或已签名的属性。顾名思义,签名值计算也包括这些属性。

这些签名属性通常包括签名时间。由于签名时间在不同的签名运行中通常会有所不同,因此实际签名值也会有所不同。

OP 使用 CMS 签名容器。因此,这很可能是 OP 签名不同的原因。

【讨论】:

  • 亲爱的 MKL,在 java.security.Signature 中是使用私钥初始化的。同样,充气城堡CMS签名数据生成过程中是否有这样的过程!
  • 但是有,您可以在该双重签名示例中看到:ContentSigner sha1Signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(privKey); 用于生成 JcaSignerInfoGeneratorBuilder,而 JcaSignerInfoGeneratorBuilder 又添加到 CMSSignedDataGenerator
猜你喜欢
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
相关资源
最近更新 更多