出于安全目的,您有什么理由不应该执行自己的算法来加扰 ID?

Is there any reason why you shouldn't perform your own algorithm to scramble IDs for security purposes?

我打算实施我自己的非常简单的“散列”公式,为具有多个用户的应用程序添加一层安全性。我目前的计划如下:

  1. 用户创建一个帐户,此时在后端生成一个 ID。 ID 是 运行 通过公式(比方说 ID * 57 + 8926 - 36 * 7,或者同样随机的东西)。然后我将新的用户 ID 和新的“散列”号码发送回前端,并将它们存储在 localStorage.
  2. 用户尝试访问安全区域(假设是设置页面,以便他们可以更改自己的设置)。
  3. 我向后端发送了两个值:它们的 ID 和哈希值。我 运行 通过相同的公式来检查 ID 是否与我收到的散列值相匹配。如果检查通过,他们就可以进入。因此,如果有人尝试更改 localStorage 中的 ID 以访问其他用户的设置页面,那么他们实现这一目标的唯一方法就是猜测公式是什么曾是。他们很容易猜到一个用户ID,但猜到对应的数字是ID * 57 + 8926 - 36 * 7 的结果似乎不太可能。

我这样做是因为它 quicker/cheaper 比数据库查找实际散列值...我想?使用包来创建某种主要 key/uuid 而不是“散列”我自己的值并每次都进行数据库查找是否更有意义?

技术堆栈:在 FE 上做出反应,Python 在 BE 上,SQL db.

您缺少的两个 属性 真实哈希是

  • 输入的简单变化会引起输出的巨大变化
  • 所有哈希的长度都相同

如果用户以某种方式知道自己的 ID 和哈希值,这可能会成为问题。 使用您自制的哈希,我可以通过对哈希进行反向工程轻松找出其他随机用户的哈希。

I see a lot of posts saying "don't roll your own" -- is this absolute?

是的。原因是,每当非密码学家尝试开发自己的算法时,他们总是会陷入大量的坑洞,从而使算法的安全性几乎毫无用处。

例如,给定两个连续的 ID 和“哈希”对,您的特定方案可能会被轻易破坏。 (简单等差数列,给定两个连续值推导等差数列的公式是~6级数学。)

I'm doing this because it would be quicker/cheaper than a db lookup for an actual hashed value...

性能差异可能可以忽略不计。不用担心。

如果信息不是特别敏感,给每个用户分配一个随机生成的128位数字即可。有人猜测有效用户号码的可能性几乎为零。