介绍
我想创建一个用于存储和备份用户文件的 Java Web 应用程序,类似于 Dropbox。Dropbox 的一项有趣功能是它可以检测服务器上是否已存在某个文件。例如,如果一个用户将文件上传到服务器,则尝试上传相同文件的另一用户将不需要上传相同的文件内容。服务器只需要标记他有相同的文件。这有助于节省带宽/空间并以多种方式提高速度。
这个问题最基本的解决方案是使用文件哈希字符串,例如sha1、md5等,来识别文件。客户端软件检查服务器上是否存在某个哈希值。如果存在,则可以跳过上传过程并标记该用户具有相同的文件。
问题
Web 应用程序基于 REST 架构实现,因此用户可以轻松编写自己的客户端软件来上传文件。出于安全原因,为所有事务启用 SSL。但我最担心的安全问题是,如果我使用 sha1 或任何其他标准哈希算法,用户会假装他们拥有一个文件而实际上没有拥有它。SSL 或加密无法避免这种情况。如果用户设法获取哈希字符串,例如可以通过谷歌搜索找到许多文件的 md5 和 sha1,他可以使用 Web 应用程序上的 REST 服务标记他拥有该文件。
所以一个可能的解决方案是服务器从文件中请求一组特定的随机字节以及整个文件的哈希值。以下是示例步骤:
- 客户端检查服务器上是否存在某个哈希值。然后,如果文件已经存在,服务器返回所需的随机字节位置。
- 如果服务器有文件,客户端会根据请求发送随机字节。如果没有实际文件,客户端软件将无法响应它。
通过这种方式,它可以节省带宽并确保用户拥有他们想要上传的文件。
问题
我不是网络安全方面的专家,所以我不知道这是否是个好主意。我读过一些关于实现自己花哨的过程可能会导致安全强度降低的文章,因为无法测试安全性,额外的信息可能会提供破解方法。
有人对这个过程有任何意见吗?
会不会降低安全感?
有没有人有想法以不同的方式解决这个问题?
我知道这个问题可能没有确切的答案,但我想知道是否有人遇到过同样的问题并有任何好的解决方案。