【问题标题】:Using a time-based, rotating hash or string for security使用基于时间的旋转散列或字符串以确保安全
【发布时间】:2011-12-19 10:12:09
【问题描述】:

在 CMS 应用中,我偶尔需要打开另一个域的 iframe。目前我正在将该 iframe 的 URL 设置为非常模糊的东西。喜欢http://domain.com/iframe/jhghjg34787386/。这可行,但理论上 iframe 源 url 将保存在用户的历史记录中,并且可以从外部世界访问。

所以,我想知道使用基于时间的方法来处理在请求端处理并在 iframe 源端检查的不断变化的哈希或字符串。但是我希望它是基于时间的。

我可以这样做来获取我的哈希:

<?php 

   $seed = '123456789'; // a password that both the parent and source have
   $string = md5(time().$seed); 
?>

但是这两个服务器必须完全同步。有什么办法可以让时间限制更加模糊?

我也对其他方法持开放态度。有什么方法可以验证 iframe 的父窗口是否属于某个域?

【问题讨论】:

    标签: php security iframe hash


    【解决方案1】:

    您可以在哈希中添加一个键,并随查询一起发送时间戳,例如:

    $key = "YOUR_SECRET_KEY";
    $time = time();
    $hash = hash_hmac('sha256', $time, $key);
    $url = "https://example.com/iframe?hash=$hash&time=$time";
    

    另一方面,您应该首先检查时间戳是否在限制范围内(例如不超过五分钟),然后使用密钥和提交的时间戳重新哈希。如果您得到相同的哈希,则请求有效。

    注意事项:

    【讨论】:

    • 请使用hash_equals,因为PHP中没有hash_compare函数。
    【解决方案2】:

    你不应该使用普通的 MD5 ; MD5 不是为确保消息的真实性而设计的。相反,您可以公开提供时间戳以及其他信息(消息),base64 编码,因此它不包含“:”字符。然后您可以计算消息的 HMAC 代码,例如使用

    $hmac = hash_hmac("md5", $message, $secret)
    $signed_message = $message . ":" . $hmac
    

    在另一端你可以检查这个签名,首先用“:”分割,得到$message和$hmac,然后你可以用

    $hmac == hash_hmac("md5", $message, $secret)
    

    如果代码匹配,则检查$message 中的时间戳是否仍在限制范围内。

    【讨论】:

      【解决方案3】:

      小心使用 MD5 进行散列 - 它在密码学上被破坏。有许多在线站点可以帮助创建冲突。而是使用 SHA256 之类的东西,并始终包含一个长的盐渍字符串。

      如果用户不必在 iframe 中与网站交互,您可以考虑抓取网站代码并将其直接插入到您的代码中。有许多可用的库。

      使用类似的东西怎么样

      $hash = hash ( "sha256" , date("h") . 'myverylongsaltstring' );
      

      只要服务器的时区正确并在一个小时内同步,这种方法就可以像您的 time() 哈希一样工作。

      此外,您可以使用 TinyUrl 之类的东西进一步混淆链接。类似于http://www.technabled.com/2008/12/create-your-own-tinyurl-with-php-and.html

      【讨论】:

        【解决方案4】:

        如果是基于时间的,那么一个人必须猜测的可能键的数量将是很小。 因为我知道大概什么时候会生成一个 URl,并且我知道你是如何散列它的,所以我可以创建数十万个链接并测试它们。

        您应该使用 UUID 或类似的东西。发生碰撞的可能性基本上是不可能的。

        【讨论】:

        • 是的,但我也会输入父级和源级都具有的“种子”/密码,因此无法猜测哈希。
        • 好吧,在阅读了 UUID 之后,是的,我会使用 UUID。但这并不能解决问题。该 URL 仍然公开。
        猜你喜欢
        • 1970-01-01
        • 2018-12-18
        • 2011-01-10
        • 2011-12-25
        • 1970-01-01
        • 1970-01-01
        • 2017-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多