0

我的情况是这样,我需要为人们提供一个他们可以用来登录的一次性代码。这些人不懂技术。他们需要提供人类可读的代码。

格式与此类似;

ACBE-adK3-SdLK-K23J

一组 4 乘 4 人类可读的字符。对于总共 16 个字符,这作为 UUID 似乎是相当安全的。但是如果需要可以很容易地扩展。

现在,是否使用说 NanoID 4 次来生成一个 4 个字符的长字符串,相当于使用它一次来生成一个 16 个字符的字符串,然后将其切碎?我觉得是这样的。以编程方式实现任何一个都很简单。但是,我真的很想知道实际的事实答案。如果某个数学专家会放纵我?

编辑:回答问题;

  • 这是为了让人们可以访问只有他们应该可以访问的照片,例如护照照片、学校照片等。人们使用代码一次将照片链接到他们的电子邮件,并从他们使用电子邮件/密码组合登录时开始。在这种情况下,让人们事先使用电子邮件注册不是一种选择。
  • 我知道使用十六进制数字是常见的情况。我需要易于人类阅读。因此,将 16 位十六进制块切割成 4 个不同的部分似乎是合乎逻辑的步骤。
  • 选择的字母将是 az AZ 0-9 并排除一些符号,例如 0/o/O 和 I/1/l 以限制错误。这将允许用更少的字符表示相同的 ID。
  • 我现在知道,NanoID 不是 UUID 实现。比。但对于我的目标,我认为这已经足够了。如果没有,我也想知道。
  • 我正在使用 Python 3
4

1 回答 1

0

诸如您在问题中给出的字符串格式最终是从整数到人类可读字符串的一对一映射。如果生成的整数是唯一的,那么人类可读的字符串也是如此。

在您的情况下,您可以在区间 [0, A S )中生成一个统一的随机整数,其中A是字母大小(例如大写字母和数字为 36),S是 ID 中的字符数(在您的示例中为 16,不包括连字符)。然后将该整数与所需格式的人类可读字符串一对一映射。

在您的情况下,ID 将用作秘密“确认码”,在这种情况下,它应该使用安全的随机生成器生成,例如Python 中的secrets.SystemRandomorrandom.SystemRandomsecrets.randbelow(但请注意,随机生成的值本身并不是唯一的)。

于 2021-04-05T13:08:15.007 回答