0

我得到一个文件,然后将其转换为字符串并替换一些单词。

使用此字符串,我运行以下命令:

com.hierynomus.smbj.share.File remoteSmbjFile = share.openFile(fileName, EnumSet.of(AccessMask.GENERIC_WRITE), null, s, null, null);
byte[] myFile= template.getBytes("UTF-8");
ByteArrayInputStream bs = new ByteArrayInputStream(myFile);
try (OutputStream outputStream = remoteSmbjFile.getOutputStream();) {
    byte[] buffer = new byte[1024];
    int length;
    while ((length = bs.read(buffer)) > 0) {
        outputStream.write(buffer, 0, length);
    }
}

该文件在网络位置创建并且很好(没有问题)。文件本身是 .xml 类型,大小在 2-10 MB 之间。

我正在使用 xml 文件类型在 word 中打开此文件,如果文件中有一个字符将被损坏。

我只是担心由于文件大小,这种方法会导致损坏。

上述方法是安全的做法吗?我可以采取其他方法吗?

4

1 回答 1

1

将大字符串转换为字节并通过网络发送是否安全?

这取决于。(没有什么是完全安全的。永远。)


我只是担心由于文件大小,这种方法会导致损坏。

大文件大小不会导致损坏。

但是,在两种情况下,大文件可能会出现问题:

  1. 如果文件的接收者不能或不愿意接受超过一定大小的文件,那么它可能会截断文件。如果这没有报告给发件人,您就有潜在的损坏来源。

  2. 网络数据包通常使用简单的基于 CRC 的错误检测机制来检测在传输过程中因网络错误而损坏的数据包。多位损坏可能(以非常低的概率1 )未被检测到。如果您在 TCP 流的顶部实现文件传输(例如),则文件损坏的可能性非常小。

1 - 实际错误率难以预测,但如果您正在传输数 TB 的数据,则由于未检测到的网络错误而导致损坏的可能性变得很大。


上述方法是安全的做法吗?我可以采取其他方法吗?

鉴于您无法阻止上述任何一种情况,您需要一种方法来绝对确保大文件传输没有损坏文件。通常这是通过以下方式完成的:

  1. 检查文件大小...仅检测截断
  2. 计算和比较文件哈希/校验和。如果您使用具有 N 位的校验和,则未检测到的随机损坏的可能性是 2^N 中的 1。

请注意,上述内容与文件类型无关。

我知道有一些标准方法可以在 XML 文件的内容上添加强数字签名。检查这样的签名也将有助于检测意外损坏。

于 2018-12-19T00:27:38.003 回答