2011-03-17 72 views
1

比方说,我想为每个用户提供一个唯一的URL来登录到系统。该URL可能如下所示:http://example.com/login/a1b2c3d5e6安全 - 登录哈希的字符数

例如,字符串a1b2c3d5e6使用小写英文字母,数字从0到9,包含10个字符,因此该长度的字符串有36^10个变体。

我应该使用多少个字符来获得一个很好的短散列字符串,但同时要确保实际上不可能暴力破解?我应该使用大写字母吗?

回答

1

我看到你在这里做什么,但我不打扰哈希等,你有碰撞的风险(微观机会,授予)。

我建议做以下几点:

1. Take the user's ID from the database (which will obviously be unique) 
2. base_convert it to base 36. (See: http://php.net/manual/en/function.base-convert.php) 
3. Use the resultant string as your URL 

的结果将是保证是独一无二的碰撞防一个非常小的字符串。

据我所知,URL缩短服务(如TinyURL等)使用这种机制来生成它们的URL。我实际上在这个网站上了解到,但无法再找到其他线索的链接。非常感谢原作者比我自己更聪明,这引起了我的注意!

我希望这很有帮助。

+2

如果你这样做,你必须确保你的数据库ID很大并且是随机的。 IE:128/256位密码随机数。如果它们很短或者如果它们是可预测的,那么有人可以猜测它们。 – AltF4 2011-03-17 23:20:08

1

如果您的登录网址是:

http://example.com/login/a1b2c3d5e6 

话,我就不会担心它的最后一部分,但关于第一部分 - HTTP。如果你的用户通过不安全的http访问你的网址,那么无论你猜测你有多难以猜出,它总是容易被窃听。使用https进行任何类型的身份验证连接。

此外,你没有解释你将在这个网址上有什么。我希望您将它作为额外的预防措施与其他形式的身份验证一起使用,而不是其他形式的身份验证而不是

说了这么多,我认为如果你的想法是你的普通用户/密码登录表单只有在URL中有正确的令牌时才工作,那么它只能使系统的安全性更强,从不更弱。这是一种安全措施,像洋葱的另外一层一样工作 - 即使是弱的一层,只会使洋葱变得更强壮,即使没有更强壮。只是不要使用它来代替其他形式的认证。对登录失败的消息不要太有帮助,例如。你的应用程序应该永远不会说这个url是不正确的,直到它是正确的,然后说这个密码是坏的。你应该只有一个一般的错误消息,因为任何失败的身份验证的原因。

现在关于令牌的长度,10个字符似乎是合理的。只要确保它是真正的随机数或者它是一个密码强大的散列,像用户名和一些秘密值这样的独特值。如果您想要现成的解决方案,您可以使用HMAC。如果你使用HMAC-SHA1,那么你会得到每个令牌20个字节。它是40个十六进制数字,你可以只用前10或20或任何你想要的,或者你可以将它编码为某种形式的Base64或Base32或其他形式。

请记住,这个标记必须是可以改变的,你必须有一个机制来提醒它忘记它的人。

如果你考虑所有这些,那么我认为使用它作为附加的认证机制没有任何坏处。