【发布时间】:2016-07-03 16:35:17
【问题描述】:
数据库级别的 UUID 可以用作安全措施而不是真正的权限控制吗?
考虑一个 Web 应用程序,其中所有 servlet 通过将会话 ID 连接到调用它的用户(通过 Web 客户端)来实现“正常”访问控制。因此,所有用户都经过身份验证。
需要的下一个安全级别是经过身份验证的用户是否真正“拥有”正在更改的数据。例如,在 Web 应用程序中,这可能是在表单中编辑某些文本。客户端确保用户不会意外地做错事(JavaScript)。问题当然是任何数量的网络工具都可以轻松地重复浏览器进行的调用,并且仅通过更改 ID,在用户不“拥有”的 servlet 后面的数据库表中编辑不同的行。
我的问题是使用 UUID 作为数据库表中的键是否足够,从而实际上无法猜测有效 ID (https://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates)?据我所知,Google 照片 (http://www.theverge.com/2015/6/23/8830977/google-photos-security-public-url-privacy-protected) 中使用了类似的方法,但我不确定它是否 100% 具有可比性。
另一个选项是让每个 servlet 验证用户只对自己的数据执行操作,但在一个有 200 多个 servlet 和 50-100 个表的大型应用程序中,这可能是一项非常繁琐的任务,可能会出现错误很容易发生。在我看来,这大大削弱了安全性,但我不确定这是否属实。
我倾向于 UUID 解决方案,但我也很好奇是否还有其他明显的方法可以解决这个问题。
更新:
我可能应该澄清我的计划是使用应该是随机的 UUIDv4。我知道熵在这里起到了关于 UUID 的实际随机性的作用,但据我所知,Java(这是选定的平台/语言)使用 SecureRandom,它应该是“加密强”(@ 987654323@)。
在这种情况下,wiki 状态 (link): 换句话说,仅在接下来的 100 年每秒生成 10 亿个 UUID 之后,仅创建一个副本的概率约为 50%。
【问题讨论】: