我认为您正在寻找单点登录的变体。这是一种技术,其中一个站点中的身份验证可以在另一个站点中透明地识别。以下是它在您的情况下的工作原理。
通常,您在 site2.com 中会有一个如下所示的链接:
http://site1.com/login.php?pin=123456789
然而,site1.com 无法从引荐来源网址判断它真正来自哪个网站,因为它很容易被伪造。当然,如果您只想要简单的安全级别,那么这对于您的用例来说可能并不重要。但如果您想要更好的东西,请继续阅读!
您可以使用散列系统和共享秘密来创建只能来自一个来源的东西。两个站点都有相同的共享密钥,存储在文件中。我们称之为$sharedSecret
。算法是这样的:
$hash = hashFunction($pin . $sharedSecret);
然后您可以在 site2.com 中执行此操作:
<a
href="http://site1.com/login.php?pin=<?php echo (int) $pin ?>&hash=<?php echo $hash ?>"
alt="Authenticated link"
>
当 site1.com 看到它时,它可以立即获取 PIN,重复该算法,并检查哈希是否确实来自 site2.com。如果您有多个引用站点,则 site1.com 应为所有站点存储一个单独的密钥,然后它可以安全地检查引用站点以查看应加载哪个站点。
共享秘密应该足够大,以至于无法被猜到;我倾向于使用 40-60 个字符左右。
然而,该计划中剩下的缺陷是,有人可以访问 site2.com 并窃取他们的链接,而且只要他们每次想要访问时都愿意伪造引荐来源网址,该计划仍然有效。因此,在算法中添加时间戳也可能很有用:
// The time is rounded to the nearest 500 seconds, to account for
// out of sync clocks. Adjust this depending on how long you want links to
// remain active for
$time = floor(time() / 500) * 500;
$hash = hashFunction($pin . $sharedSecret . $time);
然后在 site1.com 上您应该计算两个哈希值:
- One for
floor(time() / 500) * 500
- One for
floor(time() / 500) * 500 - 500
如果提供的哈希值与其中任何一个匹配,则允许该链接解锁内容。这说明了一台服务器与另一台服务器之间的时间可能超过 +/-500 边界的可能性。
我在这里没有提到特定的哈希函数。 SHA256 应该没问题,但请注意我不是密码学家。如果您再次想要更高的安全性,可能值得检查以确保有人不会通过猜测淹没您的系统来暴力破解系统 - 尽管在互联网上这几乎不值得他们尝试。