- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
想象一下,我有一些二进制文件的多个独立签名,它们存储在不同的 .sig 文件中。 当有人修改文件时,所有签名都将失效。
对于 xml,封装签名被广泛使用。检查它更加困难 - 必须提取最后一个 ds:Signature
元素,检查签名,删除最后一个元素并检查当前的最后一个 ds:Signature
元素等等。但是XML修改无论如何都会破坏最后一个签名,为什么我必须检查其他签名?
唯一的解释 - 每个 ds:Signature
或 PKCS7 签名包含公钥证书,其中包含有关签名者的信息、 key 有效期、撤销检查信息。 通常,验证过程不仅检查哈希值,还提供有关签名者的信息,这是迭代所有签名的唯一原因,对吗?
那么,当我想要验证多个签名文件并提供有关签名者的信息时,我可以进行一些小的优化 - 提取所有签名的信息,但仅在一个随机选择的签名中执行哈希检查吗?
还有一个问题 - 如何在一个文件中存储多个 PKCS7 签名?我正在使用 bouncycaSTLe Java 库。它是否有某种方法来连接签名并从一个文件中提取它们?我不想手动将所有签名存储在一个 .sig 文件中,关心签名分隔符,在 bouncy caSTLe 中可以开箱即用吗?
更新
我的 BouncyCaSTLe 签名代码
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);
如您所见,生成方法的第二个参数为 false,这意味着我正在生成非封装签名==.sig 文件不包含数据。
验证代码
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 中开箱即用地执行类似的操作(如下所述)吗?
将分离的签名封装起来 - 第一个签名 = hash(doc)-->appendToSigFile,第二个签名 = hash(doc+sigFile)-->appendToSigFile 等等。这种方法可以模仿 XML 的封装签名吗?
最佳答案
你实际上问了很多问题。因此,
如果您确定(例如由于组织原因)所有这些签名最初都正确地签署了同一文档,您可以考虑此优化。但即便如此,您也不应该随机选择签名,而应该选择那些具有更可靠算法的签名。
如果您确实进行了这样的优化,那么您绝对不应该声称所有签名仍然有效,但选择的一个仍然有效。如果您没有测试某些东西,则不应声称您已经测试过。
这很大程度上取决于您的用例。如果(如上所述)您确定(例如,由于组织原因)所有这些签名最初都正确地签署了各自的文档修订版,则检查最外层的签名可能就足够了。
另一方面,如果文档是由一个人转发给另一个人进行签名,并且您检查的任何步骤都可能发生操作,则您必须检查每个签名,以确保每个人都在没有签名的情况下签署了内容不需要的更改。
如果不是每个 XML 签名都使用至少与该签名一样严格的规范化来签署至少与各自包含的数据相同的数据(XML 签名可以非常有选择性地选择它们签名的元素以及它们允许的偏差),您绝对必须检查每一项。
显然......如果你只想检查哈希值,你只会存储哈希值(好吧,除非有政治或营销相关的原因......)。签名是为了证明特定的人在特定情况下出于特定目的看到并接受了某些特定数据。您的问题似乎只想考虑具体数据部分。
PKCS#7 签名容器可以包含任意数量的相同数据的并行签名和附加反签名。
如果你看一下规范RFC 2315你会发现:
The signed-data content type shall have ASN.1 type 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
...
signerInfos is a collection of per-signerinformation. There may be any number of elements in thecollection, including zero.
BouncyCaSTLe 提供了许多实用功能,也是为此,但由于您没有展示如何使用 BC,所以很难解释您应该如何更改 BC 的使用。
您可以使用与您的设计等效的副署。
或者... PKCS#7 签名容器允许您嵌入签名内容,无需分离。因此,您可以将原始内容嵌入到第一个签名容器中,然后将此签名容器嵌入到第二个签名容器中,依此类推。这将隐式地清楚每个签名所签名的内容。
关于java - 检查一个随机选择的数字签名是否足以验证多个签名的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28794036/
我需要根据需要动态设置文本区域,但它不想正常工作。 JQuery 会自行检查,但无法检查是否已检查。但是当您在第二个单选框内单击时,始终需要文本区域。我尝试了很多次让它工作,但它仍然有问题。我添加了“
我需要在 Django 中进行 API 调用(某种形式),作为我们所需的自定义身份验证系统的一部分。用户名和密码通过 SSL 发送到特定 URL(对这些参数使用 GET),响应应该是 HTTP 200
我将在我的可移植 C 代码中使用 #warning 来生成编译时警告。但并非所有平台都支持 #warning。有什么方法可以找到该平台是否支持 #warning。 #ifdef warning
我编写了一个函数来检查某个数字是否存在于某个区间内。停止搜索的最佳方法是什么?这个: for (i = a; i <= b; i++) { fi = f(i); if (fi == c) {
我想知道在 c 中是否有一种方法可以检查,例如在 for 函数中,如果变量等于或不等于某些字符,而不必每次都重复进行相等性检查。如果我没记错的话,以这种方式检查相等性是不正确的: if (a == (
我有如下日志功能 void log_error(char * file_name, int line_num, int err_code) { printf("%s:%d:%s\n", fil
使用 ssh-keygen 生成的 key 对在 macOS 上可以有不同的格式。 macOS 可读的标准 PEM ASN.1 对象 SecKey API 带有文本标题的 PEM OpenSSH ke
我正在尝试编写一个 excel if 语句。我不熟悉使用 Excel 具有的所有额外功能。我正在使用一个名为 importXML() 的函数.我正在尝试检查我正在使用的函数是否生成“#VALUE!”错
有没有办法检查是否没有 AIO 写入给定文件?我在我的 Unix 类(class)上制作了一个项目,该项目将是一个上下文无关(基于 UDP)的国际象棋服务器,并且所有数据都必须存储在文件中。应用程序将
我有一个如下所示的函数: public Status execute() { Status status = doSomething(); if (status != Stat
我正在使用 Composer,我不希望 PhpStorm 在 vendor 文件夹上运行任何错误检查或检查,因为它对 vendor/中的某些代码显示误报composer/autoload_static
Chapel 的一个很好的特性是它区分了数组的域和它的分布。检查两个数组是否具有相同的域和分布(通常想要的)的最佳方法是什么? 我能看到的最好的方法是检查 D1==D2和 D1.dist==D2.di
在我的 JavaScript 函数中,我为所有输入、文本区域和选择字段提供实际值作为 initial_value: $('input, textarea, select').each(function
我正在编写一个分解为几个简单函数的 PHP 类。在构造函数中,它调用另一个名为 processFile 的函数。该函数调用 5 个私有(private)函数并进行检查。如果检查失败,它会将消息分配给
这个问题已经有答案了: How to detect if user it trying to open a link in a new tab? (2 个回答) 已关闭 7 年前。 我认为 JavaS
我正在浏览我们的代码库并看到很多这样的测试: declare @row_id int = ... declare @row_attribute string select @row_attribu
我正在声明一个用作比较的函数。我的问题是: 为什么条件充当语句? 为什么第 4 行可以工作,而第 5 行却不行? 我知道这段代码不切实际且未使用,但为什么编译器允许这种语法? 谷歌没有找到答案。但话又
到目前为止,我有一个带有空文本字段的 PHP Kontaktform,并使用以下命令检查了所需的字段: $name = check_input($_POST['name'], "请输入姓名。"); 现
目前,我能想到的合理检查的唯一方法没有臃肿的逻辑: if ( $value > 0 ) { // Okay } else { // Not Okay } 有没有更好的办法? 最佳答案
我正在尝试运行一个脚本,如果 i 存在(意味着存在 i 值,任何值)或其他部分,我希望运行其中的一部分如果i没有值就运行,有人可以启发我吗? 我说的是 for 循环,比如 for (var i=0;
我是一名优秀的程序员,十分优秀!