我正在研究为多平台应用程序创建API的不同技术。这个应用程序必须为用户提供与朋友共享文件而无需身份验证的可能性,但URL必须是不可猜测的,以便文件保密。就像谷歌照片中的分享图片功能。
Spring boot是创建多平台API最有趣的框架之一,但我想知道是否有可能创建一个秘密且不可猜测的URL。
谢谢您抽时间见我。
发布于 2017-05-10 22:08:10
回答你的问题:你可以用一些随机的、难以猜测的部分(如https://hostname/fileshare/Zak/myVideos/295223cb464d4e4794b93a09a1c730fd)来组织你的URL路径。UUID是128位的数据,而且几乎是标准的。
另一种方法是在queryString:https://hostname/fileshare/Zak/myVideos/lolcat.mp4?h=187515ZED中添加校验和令牌,其中令牌是使用某种安全算法(例如hmac256)从url路径(甚至可能是queryString)生成的,并让您的Controller (或者更好的是,Filter)检查h参数是否确实等于散列路径。
编辑:进一步解释:
我假设您已经拥有(或者至少打算拥有)一个能够提供基于文件系统目录的内容的控制器。在我之前的例子中,我假设了像/Zak/myVideos/这样的东西。Spring控制器可以很容易地通过文件名返回这个目录中的文件,但是如果文件名很容易猜到(例如video.mp4),我知道/Zak/myVideos/video1.mp4将是脆弱的。这就是我建议使用UUID的原因。
如何使用UUIDS?
如果您可以重命名/Zak/myVideos中的文件,只需通过随机的UUID重命名它们,它将透明地工作。这样做的缺点是: 1)文件名不再有任何意义;2)您可能无法重命名这些文件。
您还可以拥有一个引用文件名和UUID的DB表,并简单地让控制器调用一个服务来从正确的UUID中检索正确的文件名。这样做的缺点是,您需要有一个DB并编写一些代码(并减慢查询DB的API调用)。
这就是为什么我还建议简单地使用令牌。url仍然是您的文件的litteral路径,但在queryString中需要一个额外的参数(令牌)。servletRequestFilter可以在授予对服务于文件的控制器的访问权限之前检查令牌是否有效(使用简单的散列+校验算法)。这样,您将不需要重命名您的文件或创建数据库。
https://stackoverflow.com/questions/43893459
复制相似问题