在将会话 ID 传递给广告合作伙伴之前对其进行哈希处理是否有意义?

信息安全 Web应用程序 攻击 javascript 会话管理
2021-08-15 00:04:45

我的公司经营一家网店。我们与合作伙伴合作,在客户购买后向他们提供折扣券(该优惠券可在其他在线商店使用),并将我们商店的优惠券提供给其他商店的客户。为此,合作伙伴要求我们在我们的付款完成页面上向他们发送一些关于我们的客户及其各自订单的数据。他们希望我们通过设置一些 javascript 变量并包含来自他们服务器的 javascript 来做到这一点,这也将在我们的付款完成页面上显示一个广告横幅。

我已经了解到,包括广告横幅在内是有一定风险的。看来我们公司已经决定为这个合作伙伴承担这个风险。

现在我担心一个特别的点。合作伙伴希望我们发送的数据还包括我们客户的会话 ID,以便按照合作伙伴的说明“识别双重请求”。我认为我们不应该将真实的会话 ID 发送给合作伙伴,因为有了这些信息,合作伙伴可以在我们的网站上伪造客户的身份。因此,我想发送会话 ID的哈希值。有了这个,合作伙伴应该仍然能够识别双重请求,而不能伪造客户的身份。

这有意义吗?或者合作伙伴是否因为我们从他们的服务器中包含了一个 javascript,已经有办法比他们知道会话 ID 可能造成的伤害更大?我们将会话 ID 存储在 HttpOnly cookie 中(用于我们的服务器和客户之间的连接)。

如果对会话 id 进行散列是有意义的,那么什么散列函数会是一个不错的选择?

2个回答

是的,你说的很有道理。

通过将您的 cookie 设置为HttpOnly cookie,您可以降低合作伙伴的 JavaScript 访问用户会话 ID 的风险。由于您的合作伙伴坚持为您的客户获取唯一标识符,我认为向他们发送会话 ID 的安全散列版本没有任何问题。

这里的关键点是不使用会话 ID 的散列版本作为标识符,因此你的合作伙伴将无法使用它来冒充你的客户,但同时散列版本足够唯一让您的合作伙伴认识您的客户。

至于用什么做hash,用什么hash算法都无所谓,只要它的输出长度等于或大于你的session ID即可。这种情况下,当然需要使用固定的salt(一个pepper ) 一直是因为您希望相同的会话 ID 产生相同的哈希值。

您可以轻松地为广告商生成不同的“会话令牌”,并将该广告令牌放入您的标准会话存储中。在.Net中,一些简单的事情:

void Session_Start(object sender, EventArgs e) 
{
   // assign a random GUID for the ad partner
   Session["AdToken"] = Guid.NewGuid().ToString();
}

稍后,您可以获得要提供的价值<%=(string)Session["AdToken"]%>(对于 ASPX 页面)。