我正在关注帖子generating and verifying digital signature。签名数据在所有运行中保持不变,但Detached Enveloped Signature在每次运行时都会有所不同。同一文本如何生成不同的分离包络签名?
答案 0 :(得分:2)
使评论成为答案......
同一私钥对同一数据签名的变化有两个主要原因。
某些签名算法(最重要的是DSA和ECDSA)明确地将签名创建基于随机选择的值 k 。这"随机性"是必需的,随机签名值 k 的熵,保密性和唯一性是至关重要的。至关重要的是,违反这三个要求中的任何一个都可以向攻击者揭示整个私钥。使用相同的值两次(即使在保持k秘密的情况下),使用可预测的值,或者在几个签名中的每一个中甚至泄漏几个k位,足以打破算法。该要求可以通过实际随机 k 或以确定性方式构建的 k 来实现,这也保证了熵,保密性和唯一性,参见RFC 6967
但OP指的是使用RSA的代码。该算法不需要这样的随机参数(即使填充方案可能包括随机性)。
变化的另一个原因是签名数据不仅包括文档数据。
在谈论"签名"时,人们通常不仅仅意味着签名过程字节数组输出,而是根据CMS标准的签名容器。
在这样的容器中可能有多个单独的签名,并且每个签名可能具有许多未签名或签名的属性。作为名称"签名属性"暗示,签名值计算也包括这些属性。
这些签名属性通常包括签名时间。由于签名时间通常在不同的签名运行中有所不同,实际签名值也会有所不同。
OP使用CMS签名容器。因此,这很可能是OP签名变化的原因。