无法在java

时间:2017-12-26 08:30:40

标签: java zip bouncycastle zipfile pkcs#7

我有一个使用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文件的方式有些不对劲。 请不要介意缩进,并请求你帮我试着找出错在哪里?

如果需要更多代码段,请告诉我。

1 个答案:

答案 0 :(得分:0)

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

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

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

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