Salted hash通过URL传递,用于持久登录而不使用cookie

时间:2010-09-11 14:10:49

标签: php hash login

我正在制作一个其他人将放入其网站的脚本。它专为PHP知识有限的人设计,因此他们所要做的就是包括()脚本并设置一些配置变量。这意味着标题可能已经发送,因此使用会话可能无法正常工作。我建议他们在自己的脚本中调用session_start,但我也想要一个后备选项。

我已经有一个隐藏的输入来处理表单,但我还需要链接,在其URI上附加一个查询字符串来标识会话。但是,如果哈希仅基于密码+ salt,则存在安全风险:登录用户可以单击外部链接,外部站点的所有者可以在其引用者日志中看到带有哈希的URI。所有他们必须做的就是使用那个哈希并且他们将被登录。

因此,我想以时间敏感的方式对哈希进行加密,将会话限制为10分钟。我无法弄清楚如何做到这一点。当然我可以使用time()对它进行加盐,但是如何根据哈希检查会话的年龄?

3 个答案:

答案 0 :(得分:2)

10分钟后过期会话无法保护您的用户免受会话劫持攻击。它只会通过每10分钟强制登录来成功地惹恼您的用户。您提出的方案仍然存在各种漏洞。您的盐渍哈希密码仍然可以通过许多其他渠道泄露给外界;数据包嗅探,中间代理,用户通过电子邮件发送链接到页面甚至保存的html,仅举几例。我建议你不要在没有该领域专家的情况下为自己的安全框架提供支持。即使这样,这也是一个已解决的问题。只需使用已知的可信解决方案即可。网络安全中有许多细微之处容易搞砸。

答案 1 :(得分:1)

这听起来像个坏主意。也很复杂。我绝对不会推荐它。你可能会使用这样的东西:

if (session_id() == "") session_start();

以上将基本检查会话是否已启动,否则启动会话。

由于您计划向用户分发,整个方法对我来说似乎有些偏差。我不确定你想要实现的目标,但你可以尝试使用一个JS来调用每页的PHP文件。这将使您更容易。如果你能详细说明你正在开发什么样的应用程序,那么我可能会帮助你更好。我在大众消费者软件应用程序方面有很多经验,与你正在做的类似。

答案 2 :(得分:0)

这不一定是个坏主意,但如果做得不正确就很危险。实际上,使用Hash-based Message Authentication Codes进行多域单点登录是相当常见的。一些基本规则:

  1. 永远不要将密码作为哈希的一部分包括在内(即使是盐)
  2. 需要将时间戳生成作为散列的一部分,必须使用散列传递ALONG。
  3. 每个使用此哈希的站点都应该有自己的32或64字节guid,以用作唯一的盐。
  4. 在查询字符串中传递特定数据,例如用户名,时间戳,其他任何内容和HMAC。所以它看起来像?user = steve& timestamp = 66343532233& otherdata = otherdata& HMAC = AB3445-1234144-AFBBDEDD(你明白了)
  5. 当跨站点进行站点身份验证时,应使用HTTP_REFERER(如果可能)获取生成比较HMAC的密钥。
  6. 使用实体哈希算法(首选SHA1)生成HMAC。尽可能随机生成私有站点密钥。不要使用标准派生方法,只需确保最终结果足够大/足够独特。