1

介绍

我想创建一个用于存储和备份用户文件的 Java Web 应用程序,类似于 Dropbox。Dropbox 的一项有趣功能是它可以检测服务器上是否已存在某个文件。例如,如果一个用户将文件上传到服务器,则尝试上传相同文件的另一用户将不需要上传相同的文件内容。服务器只需要标记他有相同的文件。这有助于节省带宽/空间并以多种方式提高速度。

这个问题最基本的解决方案是使用文件哈希字符串,例如sha1、md5等,来识别文件。客户端软件检查服务器上是否存在某个哈希值。如果存在,则可以跳过上传过程并标记该用户具有相同的文件。

问题

Web 应用程序基于 REST 架构实现,因此用户可以轻松编写自己的客户端软件来上传文件。出于安全原因,为所有事务启用 SSL。但我最担心的安全问题是,如果我使用 sha1 或任何其他标准哈希算法,用户会假装他们拥有一个文件而实际上没有拥有它。SSL 或加密无法避免这种情况。如果用户设法获取哈希字符串,例如可以通过谷歌搜索找到许多文件的 md5 和 sha1,他可以使用 Web 应用程序上的 REST 服务标记他拥有该文件。

所以一个可能的解决方案是服务器从文件中请求一组特定的随机字节以及整个文件的哈希值。以下是示例步骤:

  1. 客户端检查服务器上是否存在某个哈希值。然后,如果文件已经存在,服务器返回所需的随机字节位置。
  2. 如果服务器有文件,客户端会根据请求发送随机字节。如果没有实际文件,客户端软件将无法响应它。

通过这种方式,它可以节省带宽并确保用户拥有他们想要上传的文件。

问题

我不是网络安全方面的专家,所以我不知道这是否是个好主意。我读过一些关于实现自己花哨的过程可能会导致安全强度降低的文章,因为无法测试安全性,额外的信息可能会提供破解方法。

有人对这个过程有任何意见吗?

会不会降低安全感?

有没有人有想法以不同的方式解决这个问题?

我知道这个问题可能没有确切的答案,但我想知道是否有人遇到过同样的问题并有任何好的解决方案。

4

2 回答 2

2

与其让客户端上传文件内容的一些随机字节,不如让客户端上传文件随机区域的哈希值。这样,您就可以使用更广泛的尺寸,并要求客户进行验证。

不过,更好的方法可能是向客户端发送一个随机数,并要求客户端使用该数字作为密钥来计算整个文件内容的HMAC 。这在计算上更加昂贵,因为服务器也必须计算 HMAC,但它会验证客户端是否拥有整个文件,而不仅仅是其中的一小部分。

于 2011-01-20T16:38:33.760 回答
1

即使使用验证方案,此哈希功能的一个不可避免的副作用是它表明文件的副本已经存在于服务器的某个位置。这本身可能是敏感信息。

为了最严格的隐私保护,您应该放弃此功能并让每个用户上传自己的文件副本。您可以在服务器上使用哈希比较来避免存储文件的多个副本,对客户端透明。

于 2011-01-20T16:43:29.807 回答