充气城堡:每次运行时独立包围的签名变化

时间:2014-03-18 13:03:54

标签: java digital-signature bouncycastle

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

1 个答案:

答案 0 :(得分:2)

使评论成为答案......

同一私钥对同一数据签名的变化有两个主要原因。

签名算法诱导变异

某些签名算法(最重要的是DSAECDSA)明确地将签名创建基于随机选择的值 k 。这"随机性"是必需的,随机签名值 k 的熵,保密性和唯一性是至关重要的。至关重要的是,违反这三个要求中的任何一个都可以向攻击者揭示整个私钥。使用相同的值两次(即使在保持k秘密的情况下),使用可预测的值,或者在几个签名中的每一个中甚至泄漏几个k位,足以打破算法。该要求可以通过实际随机 k 或以确定性方式构建的 k 来实现,这也保证了熵,保密性和唯一性,参见RFC 6967

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

签名属性引起的变化

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

在谈论"签名"时,人们通常不仅仅意味着签名过程字节数组输出,而是根据CMS标准的签名容器。

在这样的容器中可能有多个单独的签名,并且每个签名可能具有许多未签名或签名的属性。作为名称"签名属性"暗示,签名值计算也包括这些属性。

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

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