Java下载程序从已签名的exe中删除数字证书

时间:2015-08-19 01:54:45

标签: java digital-certificate

我正在研究java下载程序,它从远程服务器提取文件并将其保存在本地。

以下是我使用的代码:

try {

    BufferedInputStream in = new java.io.BufferedInputStream(new URL(link).openStream());
    FileOutputStream fos = new FileOutputStream(destination);
    BufferedOutputStream bout = new BufferedOutputStream(fos,1024);

    byte data[] = new byte[1024];
    int count;

        while( (count = in.read(data,0,1024)) != -1){
        bout.write(data,0,count);
        }

    fos.flush();
    fos.close();
    fos.close();


    } catch(Throwable t){
    t.printStackTrace();
} 

我注意到的第一件事,服务器上的文件和下载的文件大小不完全相同 - > http://puu.sh/jGpEj/abbe832796.png(下载的文件小几个字节)。请注意,“磁盘上的大小”似乎相同。

接下来我注意到了,如果我尝试运行由java“管理员”下载的.exe,它会说“Publisher:Unknown”,这是不正确的,因为.exe是经过数字签名的。 “数字签名”标签都不存在。

有什么问题可以解决?

P.S我用Hex编辑器打开了两个文件......他们似乎都有相同的内容,除了java下载的文件丢失了最后94个字节。

1 个答案:

答案 0 :(得分:0)

您正在写BufferedOutputStream,但您正在刷新其中一个下游流。换句话说,您在错误的信息流上调用flush()

代替BufferedOutputStream bout

try {
  BufferedInputStream in = new java.io.BufferedInputStream(new URL(link).openStream());
  FileOutputStream fos = new FileOutputStream(destination);
  BufferedOutputStream bout = new BufferedOutputStream(fos,1024);

  byte data[] = new byte[1024];
  int count;

  while( (count = in.read(data,0,1024)) != -1){
    bout.write(data,0,count);
  }

  bout.flush();
  bout.close();

  in.close();

} catch(Throwable t){
  t.printStackTrace();
} 

您还应该close BufferedOutputStream,它会自动传播关闭的基础流。换句话说,您不能直接关闭FileOutputStream

最后,实际上无需在flush()之前致电close(),因为close()无论如何都会自动执行flush()

顺便说一句,如果你使用try-with-resources块,你可以让编译器为你插入关闭。