【问题标题】:Not able to sign zip file using pkcs#7 and bouncyCastle in java无法在 java 中使用 pkcs#7 和 bouncyCastle 对 zip 文件进行签名
【发布时间】:2017-12-26 17:24:24
【问题描述】:

我有一个程序可以使用 pkcs#7 和 bouncycastle 对文本和 zip 文件进行签名和验证。 我正在将以下字符串写入文本和 zip 文件(其中包含 base64 编码的原始数据、SignedBytes 和证书数据):

String finalmsg="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n" +
                     "<Envelope>\n" +"    <OrgContent>"+new String(Base64.encode(contentbytes))+"</OrgContent>\n"+"    <Signature>"+new String(Base64.encode(signedBytes))+"</Signature>\n"+"    <Certificate>"+
                    new String(Base64.encode(keyStore.getCertificate("CertName").getEncoded()))+"</Certificate>\n"+"</Envelope>";

我能够在签名后完美地验证我的文本文件。也能够验证我的 zip 文件,但无法提取 zip 文件(出现意外的 zip 文件结束错误)

以下是将我的签名消息写入文件的代码:

if(file.getName().contains(".zip")) {
byte[] b = finalmsg.getBytes(StandardCharsets.UTF_8);
try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(address+"SIGVERFILES/s2/"+name), 4096)) {
    out.write(b);
}
} else {
    FileWriter fw = new FileWriter(address+"SIGVERFILES/s2/"+name,true);
    BufferedWriter bw = new BufferedWriter(fw);
    bw.write(finalmsg);
    bw.close();
}

还能够验证并成功解压缩由其他方签名的 zip 文件。所以我的验证码没问题。我认为编写 zip 文件的方式有问题。 请不要介意缩进并要求您帮助我尝试找出这里做错了什么?

如果需要更多代码 sn-ps,请告诉我。

【问题讨论】:

    标签: java bouncycastle zip pkcs#7


    【解决方案1】:

    您不能只将 XML 字符串写入文件,将其重命名为“whatever.zip”,然后期望结果是有效的 zip 文件。 Zip 是一种具有自身约束的二进制文件格式,其中一个约束是文件开头以“PK”开头的幻数。

    交换签名数据也有自己的约束,PKCS#7 SignedData也是一种规范化格式。

    为了让您的生活更轻松,BouncyCastle 提供了帮助类来生成有效、正确包装的签名数据。查看他们的文档和示例 herehere

    您将需要决定是生成附加签名还是分离签名:使用附加签名,ASN.1 结构包含签名消息,因此您可以读取验证签名并从同一数据块读取有效负载(例如: RSA 证书)。使用分离的签名,您可以分别传输数据及其签名(但接收方需要两者来验证签名 - 例如:可在公共 FTP 服务器上下载的签名文件)。通常这个问题的回答很简单,就是问自己接收者是否想在不先验证其签名的情况下使用有效负载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 2011-03-16
      • 2013-02-08
      相关资源
      最近更新 更多