2

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

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

  1. 是独一无二的。
  2. 用户正确输入相当容易。
  3. 黑客很难猜到。
  4. 要么在插入时由数据库创建,要么在插入之前由应用程序创建(即不依赖于标识列)。

现有解决方案满足前两个标准,但不满足后两个标准。有谁知道满足上述所有标准的好解决方案?

还有一点需要注意:即使此代码由用户在外部使用,并且即使 Id 可以为其他表提供更好的标识符以将其外键链接到,GroupCode 也被其他表用于引用特定组。

提前致谢。

4

2 回答 2

1

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

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

于 2009-09-14T13:16:59.550 回答
1

是否可以添加一个新列?它可以由身份和一个随机的 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

另请查看语音记忆密码生成算法

于 2009-09-14T20:32:52.823 回答