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

时间:2009-11-09 19:05:27

标签: ruby-on-rails url encoding

作为Web应用程序的一部分,我需要一个auth-code作为URL参数传递。 我目前正在使用(在Rails中): 摘要:: SHA1.hexdigest((object_id + rand(255))。to_s)

提供如下的长字符串: http://myapp.com/objects/1?auth_code=833fe7bdc789dff996f5de46075dcb409b4bb4f0

然而,它太长了,我想我可以使用URL中的更多合法字符来“压缩”此链,例如除了数字之外的整个大写和小写字母。

你有一个代码snipplet吗?

4 个答案:

答案 0 :(得分:1)

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(十六进制)转换为使用[0-9a-z]的基数36 就个人而言,如果你觉得它太长,我会把代码切成两半。

答案 1 :(得分:0)

由我的同事提供:

  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*")

使用这两个片段,您可以根据需要自定义它。

答案 2 :(得分:0)

gpaul得到的是哈希函数仍然是哈希函数,即使它们被截断,只有更高的冲突机会,但只有10位,它仍然是相当低的冲突率。例如,如果你看看bit.ly,它们的哈希值是完全微不足道的,但正如你所说,它们使用的是base-32而不是base-16,这并不重要。

重要的是你要问一下如果人们碰撞会有什么风险,因为即使有完整的SHA1,仍然有机会(加密不可能)。如果真的没有巨大的危险,我认为你可以降到5-10个字符。

但问题仍然存在,原因仍然存在。在您的电子邮件中,您可能正在发送一个人们只需单击正确的链接?如果你能告诉我们为什么网址太长,可能会有一个更好的选择。

答案 3 :(得分:0)

这是正确的:我的应用程序有用户点击包含授权代码的电子邮件上的链接。 当用户单击该链接时,他最终会在webapp上,但他没有被重定向。身份验证代码将保留在URL栏中。 我的每个用户都有一个身份验证代码。如果发生碰撞,那么两个用户之间无法区分的是什么。

感谢您非常宝贵的意见,我能够找出要在Google中输入的内容以获取有关该主题的信息:“base 62”。

所以我找到了base62 gem: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

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