独特的标识符,用户友好且难以猜测

时间:2009-09-14 13:10:35

标签: identifier

我的团队正在开发一个带有旧数据库的应用程序,该数据库使用两个不同的值作为Group对象的唯一标识符:Id是一个自动递增的Identity列,其值在插入时由数据库确定。 GroupCode由插入后的应用确定,并且为"Group" + theGroup.Id

我们需要的是一种生成GroupCode的算法:

  1. 很独特。
  2. 用户输入相当容易。
  3. 黑客难以猜测。
  4. 在插入时由数据库创建,或者在插入之前由应用程序创建(即不依赖于标识列)。
  5. 现有解决方案符合前两个标准,但不符合最后两个标准。有没有人知道满足上述所有标准的良好解决方案?

    还有一点需要注意:尽管此代码由用户在外部使用,即使Id会为其他表链接其外键提供更好的标识符,但其他表使用GroupCode来引用特定的组。

    提前致谢。

2 个答案:

答案 0 :(得分:1)

您是否研究过Base32 / Base36内容编码? Identity32列的Base32表示将使其唯一,易于输入但绝对不安全。但是,大多数非程序员不知道如何生成字符串值。

同样使用Base32 / 36,您可以维护基于正常数据库整数的主键。

答案 1 :(得分:1)

是否可以添加新列?它可以包含Identity和随机的32位数字。

然后可以将64位数转换为“难忘的随机字符串”。它不是完美的安全性,但可能足够好。

以下是使用Ruby和Koremutake gem

的示例
require 'koremu'
# http://pastie.org/96316 adds Array.chunk
identity=104711
r=rand(2**32)<<32 # in this example 5946631977955229696
ka = KoremuFixnum.new(r+identity).to_ka.chunk(3)
ka.each {|arr| print KoremuArray.new(arr).to_ks + " "}

结果:

  

TUSADA REGRUMI LEBADE

另请查看Phonetically Memorable Password Generation Algorithms