我有一个用户帐户“会员中心”,显示他们与我公司的所有客户订阅和会员资格。这是https://secure.example1.com/membercenter/。
我有另一个网站,它是真正的会员网站。这是http://www.example2.com/。 (每个站点位于不同的域上,尽管它是相同的专用服务器。
我想提供轻松登录会员网站,而不在链接中包含用户的用户名和密码。
所以我想出的是:
当用户单击其成员资格的“登录”链接时,我创建了其userid + unix时间戳的md5哈希值,并将其与用户ID和时间戳一起添加到数据库表中。
然后我重定向到http://www.example2.com/login?hash=(the哈希)。
example2上的登录脚本接受哈希并在同一个表中查找。如果存在哈希,我使用存储在哈希中的用户ID从客户数据库中检索他们的用户名和密码,并将其传递到站点的预先存在的登录功能,然后他们就会登录。
当此哈希登录脚本运行时,它首先删除超过5分钟的所有行,然后检查传递的哈希值。如果找到散列,则会将用户登录,然后删除表中使用的散列。这意味着表中永远不会有超过5分钟的哈希值。唯一一次(应该)是表中遗留的哈希是用户以某种方式在点击链接之后不能从secure.example1.com到www.example2.com(例如,互联网在右边下降)第二,dns问题解决example2.com等)。 5分钟到期意味着他们可以坐在那里重新加载重定向的URL,直到他们进入,或者直到5分钟过去。
当用户被重定向时,他们确实看到了哈希值。
每次从secure.example2.com点击登录链接时,都会计算并存储新的哈希值。
我的问题是......我错过了一些明显的东西吗?你会如何打破或破解这个?我刚刚在我的网站上创建了一个巨大的安全漏洞吗?
非常感谢Hive Mind!
编辑:这是来到www.example2.com并使用您的用户名/密码使用表单登录的正常模型的补充。
EDIT2:响应tobyhede re:嗅探哈希值。攻击者还必须阻止用户访问www.example2.com上的登录脚本,因为哈希一旦被使用就会被删除。如果他们能够阻止它,那么他们还必须在五分钟内使用哈希,否则它将被自动删除。
EDIT3:Re:攻击者生成自己的哈希:黑客必须将这些哈希值插入数据库并包含有效的用户ID(没有用户知道他们的用户ID)。他们会怎么做?由于哈希只使用一次然后立即删除,我不相信下面的任何攻击都会起作用。
答案 0 :(得分:3)
所有人需要做的是使用哈希拦截URL,并且他们可以访问您的系统。你真的应该使用HTTP POST通过SSL传递哈希值。
答案 1 :(得分:2)
虽然你无法让这种方案完全无懈可击,但有许多方法可以改善它:
知识密码学证明方案可能适用于这种情况,以便最安全地解决问题。在今天早上的会议之后,我的大脑有些过于糊涂,以说明他们的适用性有任何明智之处:)
答案 2 :(得分:0)
如果攻击者知道用户即将登录,则攻击者可以生成散列(或一系列具有略微不同时间戳的散列)并在用户执行此操作之前登录。稍微好一点的解决方案是用随机生成的令牌替换散列。然后攻击者必须拦截用户对站点example2的登录请求。
只要您在站点示例2上使用HTTP而不是HTTPS,就不会有任何方案安全。例如,比方说,您找到了安全的站点example2的完美登录方案。但是,在登录之后,来自用户的请求将在URL或请求标头(例如,cookie)中发送会话信息。可以拦截这些请求,攻击者可以窃取会话信息。在最糟糕的情况下,攻击者会将会话链接到他们的源IP,攻击者需要伪造源IP。
答案 3 :(得分:0)
用户是否认为您在哈希中使用的ID和用户登录该站点的ID不同?这是在生成哈希值攻击系统时的关键部分。另一件需要考虑的事情是,您使用的ID很容易猜到,比如数字或单词?
您必须提出一个解决方案,其中包含攻击者不容易猜到的内容。基本上你想在你的哈希中有一个秘密,攻击者几乎不可能猜到。这就是为什么在哈希中使用salt(随机位)的方法就是这样。
我想你是否知道针对MD5和SHA-1哈希的攻击?在MD5中,实际上存在哈希冲突的可能性(http://merlot.usc.edu/csac-s06/papers/Wang05a.pdf),其中SHA-1仍然是安全的,但对两个哈希也有rainbow table attacks。
使用salt生成哈希,用户ID和时间戳听起来对您的解决方案是可行的。我还建议你在使用后删除哈希。