代码之家  ›  专栏  ›  技术社区  ›  jyoungdev Thilo

用户友好且难以猜测的唯一标识符

  •  2
  • jyoungdev Thilo  · 技术社区  · 15 年前

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

    我们需要一个生成groupcode的算法:

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

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

    另一个注意事项:尽管此代码由用户在外部使用,并且即使ID可以为其他表提供更好的标识符以将其外键链接到,但其他表使用group code引用特定的组。

    事先谢谢。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Community chadoh    7 年前

    是否可以添加新列?它可以由标识和随机的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 + " "}
    

    结果:

    图萨达·雷格鲁米·莱巴德

    也签出 Phonetically Memorable Password Generation Algorithms .

        2
  •  1
  •   Kane    15 年前

    你研究过base32/base36内容编码吗?标识种子列的base32表示将使其唯一、易于输入但绝对不安全。然而,大多数非程序员都不知道字符串值是如何生成的。

    也可以使用base32/36维护普通的基于数据库整数的主键。