对于xml来说,一个封装签名被广泛使用。检查比较困难,需要提取lastds:signature
元素,检查签名,删除最后一个元素,检查当前lastds:signature
元素等等。但是XML修改无论如何都会破坏上一个签名,为什么我必须检查其他签名呢?
唯一的解释-每个ds:signature
或PKCS7-签名包含公钥证书,其中包含签名者、密钥有效期、撤销检查信息等信息。通常,验证过程不仅仅是检查散列,而是提供关于签名者的信息,这是迭代所有签名的唯一原因,对吗?
所以,当我想验证多个签名文件并提供有关签名者的信息时,我是否可以对所有签名做小的优化----exract信息,但只在一个随机选择的签名中执行哈希检查?
Certificate[] certchain = (Certificate[]) keystore.getCertificateChain(alias);
final List<Certificate> certlist = new ArrayList<Certificate>();
for (int i = 0, length = certchain == null ? 0 : certchain.length; i < length; i++) {
certlist.add(certchain[i]);
}
Store certstore = new JcaCertStore(certlist);
Certificate cert = keystore.getCertificate(alias);
ContentSigner signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").
build((PrivateKey) (keystore.getKey(alias, getPassword().toCharArray())));
CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
generator.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").
build()).build(signer, (X509Certificate) cert));
generator.addCertificates(certstore);
CMSTypedData cmsdata = new CMSProcessableByteArray(content);
CMSSignedData signeddata = generator.generate(cmsdata, false);
CMSSignedData cms = new CMSSignedData(new CMSProcessableByteArray(contents.getBytes()), signature);
Store store = cms.getCertificates();
SignerInformationStore signers = cms.getSignerInfos();
Collection c = signers.getSigners();
Iterator it = c.iterator();
while (it.hasNext()) {
SignerInformation signer = (SignerInformation) it.next();
Collection certCollection = store.getMatches(signer.getSID());
Iterator certIt = certCollection.iterator();
X509CertificateHolder certHolder = (X509CertificateHolder) certIt.next();
cert = new JcaX509CertificateConverter().setProvider("BC").getCertificate(certHolder);
ok = signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert));
if (!ok) break; // probably should remove it
}
问题-我可以在BouncyCastle中开箱做这样的事情吗(描述如下)?
将分离的签名封装起来--第一个符号=哈希(doc)-->AppendToSigFile,第二个符号=哈希(doc+SigFile)-->AppendToSigFile,依此类推。这种方法是否可以模仿XML的封装签名?
你实际上问了很多问题。因此,
>
当我想验证多个签名文件并提供有关签名者的信息时,我是否可以进行小的优化-提取所有签名的信息,但只在一个随机选择的签名中执行哈希检查?
如果您确信(例如,由于组织原因)所有这些签名最初正确地签署了同一文档,您可以考虑进行这种优化。但即使这样,您也不应该随意选择签名,而应该选择那些具有更可靠算法的签名。
PKCS#7签名容器可以包含任意数量的相同数据的并行签名和附加的计数器签名。
如果您查看规范RFC2315,您会发现:
SignedData内容类型应具有ASN.1类型SignedData:
SignedData ::= SEQUENCE {
version Version,
digestAlgorithms DigestAlgorithmIdentifiers,
contentInfo ContentInfo,
certificates [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL,
crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
signerInfos SignerInfos }
DigestAlgorithmIdentifiers ::= SET OF DigestAlgorithmIdentifier
SignerInfos ::= SET OF SignerInfo
我想验证两个APK文件是否已使用相同的证书签名。 我有整个JavaSDK可用,但想从Java代码使跨平台的原因。 有什么想法吗?
我有字节数组格式的公钥。在我的数据库里。像这样 在此处输入图像描述 总是suc=false。我确信bytetoverify的值与方法符号中的输入值相同。 我不知道我用这种方式生成公钥是问题还是符号有问题。在符号方法中,我使用sh1和pkcs1,但在验证中,我只找到sh1。 每个人都能帮我吗?
我有一个API通过apigateway服务,使用AWS_IAM身份验证。我希望使用lambda授权程序,这样我就可以实现自定义授权。我意识到我可以使用认知或自定义OAuth应用程序,并让我的客户发送相关的授权令牌。 但是,我当前的客户端已经发送了一个AWS v4签名(用于AWS_IAM实现),我可以使用它来识别用户并验证签名是否有效吗? 在授权程序lambda中收到的令牌如下所示:
我的手被https、ssl、PKI之类的东西弄得脏兮兮的。对于自签名证书,有一点我不太理解。假设我想创建一个自签名证书,并在我们想要建立安全连接时将其发送给我的朋友。 所以步骤是: 创建一个私钥。 创建一个公钥。 用我的公钥在证书上签名。 因此,当我的朋友得到我的证书时,他必须验证他得到的证书是我的,他需要解密数字签名。但为了解密和验证他必须拥有我的私钥。所以,我有点困惑。
在我的应用程序中,我有一个公钥(表示为字符串),普通消息和数字签名,表示为base64编码字符串,用SHA256散列,用RSA加密)。现在,我需要验证数字签名。我试图做如下操作: 从创建(取自此处) 根据原始消息创建SHA256摘要 使用函数验证签名 (我正在努力避免使用OpenSSL函数) 此外,我的数字签名是使用Java的SHA256withRSA方法创建的。我在这里读到SHA256WithR
我对iTextSharp有意见。我有一个带有表单字段的文档,并且我已经为签名生成了字段。当第一个人在文件上签字时,它就会正常工作。Adobe Reader显示有效签名。当我让第二个人在文档上签名时,Adobe Reader显示签名1现在是“未知签名”,签名无效。Adobe reader显示: 此签名中包含的格式或信息有错误(支持信息:SigDict/Contents非法数据)