Java 蹦蹦跳跳城堡:每次跑步时都会有独立的信封签名变化

Java 蹦蹦跳跳城堡:每次跑步时都会有独立的信封签名变化,java,digital-signature,bouncycastle,Java,Digital Signature,Bouncycastle,我在跟贴。签名数据在所有运行时保持不变,但分离的信封签名在每次运行时都会发生变化。同一文本如何生成不同的独立信封签名?要使注释成为答案 使用相同私钥的相同数据的签名可能会有所不同,主要原因有两个 签名算法引起的变异 某些签名算法,首先是明确地基于随机选择的值k创建签名。这种“随机性”是必需的,随机签名值k的熵、保密性和唯一性是至关重要的。违反这三项要求中的任何一项都会将整个私钥泄露给攻击者,这一点非常关键。使用相同的值两次(即使在保持k秘密的情况下),使用可预测的值,或者在多个签名中的每个签名中

我在跟贴。签名数据在所有运行时保持不变,但分离的信封签名在每次运行时都会发生变化。同一文本如何生成不同的独立信封签名?

要使注释成为答案

使用相同私钥的相同数据的签名可能会有所不同,主要原因有两个

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

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

特征属性引起的变化 变化的另一个原因是签名数据不仅仅包括文档数据

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

在这样的容器中可能有多个单独的签名,每个签名都可能有许多未签名或已签名的属性。正如名称“签名属性”所暗示的,签名值计算也包括这些属性

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


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

这种行为是设计的,因为存在随机部分。CMS签名容器中的签名通常包含签名时间属性。此签名时间显然随每次运行而变化,签名也是如此(它是一个已签名的属性)。尽管如此,您引用的帖子看起来有点可疑:它首先使用
签名
对一些文本进行签名,然后将生成的签名字节包装在
CMSTypedData msg
中,然后使用
ContentSigner sha1Signer
对其进行签名。这种迭代签名很可能没有意义。亲爱的MKL,在java.security.Signature中,签名是使用私钥初始化的。同样,bouncy castles CMS签名数据生成过程中是否有这样的过程!但是,在这个双重签名示例中,您可以看到:
ContentSigner sha1Signer=new JcaContentSignerBuilder(“SHA1withRSA”).setProvider(“BC”).build(privKey)用于生成
JcaSignerInfoGeneratorBuilder
,然后将其添加到
CMSSignedDataGenerator