无法逆向工程的顺序识别字符串(“发票号码”问题)

信息安全 哈希 数据库
2021-08-30 12:53:55

假设我经营一个网站,您可以在其中创建猫图片。我给每张猫的照片一个唯一的标识符,以便它可以在社交媒体上与http://catpictures.com/base62Identifier.

我可以为猫图片提供顺序标识符,例如 1、2、3 等,但随后可以轻松发现用户每天创建多少新猫图片(通过每天返回 HTTP 200 的最大标识符)。这让我了解了每月从竞争对手那里订购一次产品并记下发票编号的常见策略。网站流量数据与业务收入密切相关,因此我显然希望对这些信息保密。

我正在考虑尝试:

这听起来像是散列算法的工作,对吧?问题在于通过观察哈希很容易判断是哪个算法创建了它(md5、crc32 等)。有彩虹桌的人会很快完成这个想法。我可以对标识符 [hash("salt"+1), hash("salt"+2), ...] 加盐,但随后将不得不担心与盐相关的安全性。和碰撞检查。

我的另一个想法是生成一个随机字符串并将其用作数据库中猫图片的主键(或者我可以散列猫图片数据的前 n 位)。这样我只需要检查碰撞。

是否有一种标准的最佳实践方法可以避免通过您的唯一标识符 URL 暴露您的流量?

编辑:我正在专门寻找一种将安全性和适用性完美结合为数据库主键或可索引列的解决方案。

4个回答

解决此类问题的标准方法是为每张图片创建一个UUID(通用唯一标识符)这通常是一个随机的 128 位标识符,您可以将其分配给每张图片,而无需特别担心可能通过对命名空间的暴力攻击来枚举图片。

例如,在 .NET 中,您可以将GUID结构用于这种目的。从 Windows 2000源代码)开始,Guid.NewGuid生成随机(版本 4)UUID。(古代版本生成了一个版本 1 UUID,它显示了它的生成日期,没有保护您免受“发票编号”问题的影响。)

我会简单地使用图片哈希。有人弄清楚您使用的哈希有什么问题?如果我认为“这部分 url 看起来像一个 sha1”,下载文件并且它有那个sha1,我是对的。但这并不能让我打破你的«猫安全»。即使尝试破坏哈希以找出图片是可以治疗的,但尝试这样做而不是简单地下载它是没有意义的。

只需生成图像数据的加密安全哈希并将其用作标识符。

这有两个副作用:

  • 人们可以通过请求具有该哈希的图像来判断图像是否已存在于您的服务中。
  • 人们不能上传重复的图像。

这两种影响本质上都不是坏事。他们甚至可能派上用场。但是,如果您想避免它们,您可以使用来自安全随机数生成器的伪随机数对每个图像散列进行加盐处理。

顺便说一句,碰撞没什么好担心的。使用像 SHA256 这样的散列函数,随机碰撞的可能性非常小,当你找到一个.

标准方法是简单地使用加密安全伪随机数生成器 (CSPRNG) 随机生成您的 URL。

不需要任何散列等 - 只需使用普通的旧随机数。它们也不需要是 GUID(除非您的数据库出于某种原因比简单数字更好地处理 GUID)。大概您的网站已经记住了每个 URL 可以访问哪个图像,因此只需修改它以处理随机 URL 而不是顺序 URL。

一个 128 位的随机数应该足够长。

请记住在处理新图像时检查重复的 URL。