代码之家  ›  专栏  ›  技术社区  ›  nicolasochem

在URL参数中使用A-Za-z0-9的身份验证代码

  •  2
  • nicolasochem  · 技术社区  · 16 年前
    4 回复  |  直到 16 年前
        1
  •  1
  •   Gustav Paul    16 年前
    your_auth_code = Digest::SHA1.hexdigest((object_id + rand(255)).to_s)
    
    your_shortened_code = your_auth_code.to_i(16).to_s(36)
    

    将auth_code从16进制(十六进制)转换为36进制,其中使用[0-9a-z]

        2
  •  0
  •   user155104 user155104    16 年前

    感谢我的一位同事:

      CHARS = [*'a'..'z'] + [*'A'..'Z'] + [*0..9]
      def create_token
        self.token = (0..9).map { CHARS[rand(CHARS.size)] }*''
      end
    

    还有一个使用32+范围内的一堆ascii字符,但由于非法字符,它不适合您的用例(url),但您可能想用于密码盐等。这是詹姆斯·巴克提供的:

    Array.new(32) { 32 + rand(95) }.pack("C*")
    

    有了这两个片段,你可能可以根据自己的需要进行定制。

        3
  •  0
  •   Chuck Vose    16 年前

    gpaul的意思是,即使哈希函数被截断,它们仍然是哈希函数,只是碰撞的可能性更高,尽管只有10位,碰撞率仍然很低。例如,如果你看看bit.ly,它们的哈希值非常小,但正如你所注意到的,它们使用的是32进制而不是16进制,这真的没那么重要。

        4
  •  0
  •   nicolasochem    16 年前

    我的每个用户都有一个身份验证码。如果发生碰撞,关键在于无法区分两个用户。

    所以我找到了base62宝石: http://github.com/jtzemp/base62

    现在,我的公式是:

    Digest::SHA1.hexdigest((object_id + rand(255)).to_s).to_i(16).base62_encode.slice(0..10)
    

    这给了我一个auth_code,比如:Fw1eDr701PY

    这是一个很好的妥协。如果我的应用程序征服了世界,我仍然可以添加数据库查找以避免重复,但现在我会坚持使用它。