【问题标题】:What can I use to generate a not guessable url for each user?我可以用什么来为每个用户生成一个不可猜测的 url?
【发布时间】:2020-02-18 16:06:29
【问题描述】:

我正在开发一个包含用户和个人资料图片的项目。我需要将这些图像保存在一个文件夹中,并且能够通过知道用户 ID 来接收图像。

我正在想象类似/images/profiles/{hash of user ID here}.png 用户 ID 将是一个整数,例如 52 或 495

  • 用于散列网址的标准是什么?
  • 为此目的使用来自bcryptpassword_hash 是否安全?
  • 我还有哪些其他选择?

【问题讨论】:

  • 为什么要混淆它?只需使用用户 ID。
  • 用户不一定是公开的。如果我不混淆它,他们的个人资料图片就会公开。不知道为什么我必须证明这一点。
  • 不要求你证明任何事情。如果图片有 URL,则无论您如何处理该名称,该图片都将公开可用。无论如何,像用户 ID 的 MD5 散列这样简单的东西就足够了。你并不是真的想保护任何东西,只是让它变得不那么明显。
  • 我基本上不希望用户猜测网址几乎是不可能的。据我所知,MD5 被密码破解了,我猜如果它被使用了,很容易发现它。
  • 因为它是单向哈希,即使有人知道它是 MD5 哈希,您也不会拥有重复的用户 ID,因此有人可能会尝试“破解”它以找出答案检索图片的用户 ID 没有意义。如果您不希望它明显是 MD5 哈希或 password_hash 哈希,则可以简单地使用带有微秒和随机字符的日期戳。

标签: url encryption hash bcrypt


【解决方案1】:

您应该生成一个通用唯一 ID (UUID) 并使用它来识别用户,而不是使用序列号。 UUID 也可以成为您正在使用的 URL 的一部分。

在您的情况下,我建议UUIDv4,它将包含 122 位随机性。由于您的用户 ID 不应公开或不可猜测,因此您必须确保您使用的 UUID 生成器由安全的随机数生成器支持。

如果 122 位随机性不足以满足您的需求,只需使用安全随机数生成器生成一些足够长度的随机数据,然后将其转换为十六进制。

但是如果您必须能够控制谁可以访问为用户存储的信息,那么您就走错了路。在这种情况下,您将无法实现身份验证/授权层。

【讨论】:

  • 给定 OP 的问题 Y 的问题 X 的正确解决方案。xyproblem.info
  • 122 位随机性是足够安全的。即使您生成 2^58 个 UUID,您仍然只有大约 2^64 分之一的机会复制一个。
猜你喜欢
  • 2014-03-09
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 2011-05-26
  • 2012-01-31
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多