2011-01-20 63 views
1

介绍安全的文件服务器

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

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

问题

Web应用程序是基于REST的架构,使用户可以轻松编写自己的客户端软件来上传他们的文件执行。出于安全原因,所有事务都启用了SSL。但是我最担心的是如果我使用sha1或任何其他标准哈希算法,用户伪造他们拥有一个文件而没有真正拥有它。这不能通过SSL或加密来阻止。如果用户设法获得散列字符串,例如许多文件的md5和sha1可以通过Google搜索找到,他可以标记他拥有使用Web应用程序上的REST服务的文件。

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

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

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

问题

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

有没有人对这个过程有任何评论?

它会降低安全性吗?

有没有人有一个想法来解决这个问题的不同?

我明白,这个问题可能没有完全的答案,但我想听听是否有人遇到同样的问题,并有很好的解决方案。

+0

我不明白,为什么如果客户声称拥有某个文件却没有这个安全问题呢? – 2011-01-20 16:22:58

+0

@ChristofferHammarström:如果我理解正确,散列功能可以让用户请求服务器“将带有这种散列的文件放到我自己的存储区域中,就好像我上传了它”一样,服务器将按照只要该文件先前已被其他人上传。然后,攻击者可以*下载*他刚刚“上传”的文件,以访问其内容。 – Wyzard 2011-01-20 16:30:42

+0

我是否正确使用术语安全性?但是,有人声称他们拥有一个文件而没有拥有文件,这是一个问题。假设有人用哈希字符串在网上发布了一张照片。稍后,照片被删除,但哈希字符串保留在网络上。这张照片也上传到webapp服务器上的所有者帐户。显然,另一个用户想要得到这张私人照片,他们可以声称他们使用了散列字符串。这意味着拥有该文件的哈希字符串使您成为文件的所有者,这也是我想要阻止的。 – gigadot 2011-01-20 16:34:12

回答

2

而不是要求客户端上传的文件的内容有一些随机字节,它可能是更好的让客户端上传随机区域的哈希文件。这样,您可以使用更广泛的尺寸来请求客户验证。

更重要的是,虽然,可能是向客户端发送一个随机数,并要求客户使用该号码作为密钥来计算的整个文件内容的HMAC。由于服务器必须计算HMAC,所以这在计算上更加昂贵,但它验证客户端是否具有整个文件,而不仅仅是其中的一小部分。

1

即使对于验证方案,此散列功能的一个不可避免的副作用是它揭示文件的副本已存在某处在服务器上。这本身可能是敏感信息。

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