Php 使用基于时间的旋转散列或字符串进行安全保护

Php 使用基于时间的旋转散列或字符串进行安全保护,php,security,iframe,hash,Php,Security,Iframe,Hash,在CMS应用程序中,我偶尔需要打开另一个域的iframe。目前,我正在将iframe的URL设置为非常模糊的内容。喜欢这是可行的,但理论上,iframe源url将保存在用户的历史记录中,并且可以从外部世界访问 因此,我想知道如何使用基于时间的方法来处理不断变化的哈希或字符串,这些哈希或字符串在请求端处理,并在iframe源端检查。然而,我希望它是基于时间的 我可以这样做来获取我的哈希: <?php $seed = '123456789'; // a password that b

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

因此,我想知道如何使用基于时间的方法来处理不断变化的哈希或字符串,这些哈希或字符串在请求端处理,并在iframe源端检查。然而,我希望它是基于时间的

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

<?php 

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

但是这两台服务器必须完全同步。有没有办法让时间约束变得更加模糊


我也愿意接受其他方法。是否有任何方法可以验证iframe的父窗口是否属于某个域?

如果它是基于时间的,则用户必须猜测的可能关键点的数量将非常小。 因为我知道大概什么时候会生成一个URl,我知道你是如何对它进行散列的,所以我可以创建成千上万个链接并测试它们


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

您可以将密钥添加到哈希中,并随查询一起发送时间戳,例如:

$key = "YOUR_SECRET_KEY";
$time = time();
$hash = hash_hmac('sha256', $time, $key);
$url = "https://example.com/iframe?hash=$hash&time=$time";
另一方面,您应首先检查时间戳是否在限制范围内(例如,不超过5分钟),然后使用密钥和提交的时间戳重新刷新。如果得到相同的散列,则请求有效

注:

  • 不要使用MD5:该算法已完全崩溃,不再提供任何安全性(尽管它与HMAC一起使用时应该仍然可以…)
  • 您应该使用
    hash_equals
    来比较哈希以防止定时攻击
  • 我们使用HMAC来保证数据完整性和身份验证。看看为什么我们不能只连接时间和键

小心使用MD5进行散列-它是加密破坏的。有许多在线站点可以帮助创建冲突。而是使用像SHA256这样的东西,并且总是包括一根长的盐绳

如果用户不必与IFRAME中的站点交互,则可以考虑删除站点代码并将其直接插入到代码中。有许多库可用于此目的

用这样的东西怎么样

$hash = hash ( "sha256" , date("h") . 'myverylongsaltstring' );
只要服务器的时区正确并且在一小时内同步,这种方法就会像time()散列一样工作


此外,您还可以使用TinyUrl之类的工具进一步模糊链接。类似于

的东西,你不应该使用普通的MD5;MD5不是为确保消息真实性而设计的。相反,您可以将时间戳与其他信息(message)一起公开,以base64编码,这样它就不包含“:”字符。然后,您可以计算消息的HMAC代码,例如

$hmac = hash_hmac("md5", $message, $secret)
$signed_message = $message . ":" . $hmac
在另一端,您可以检查此签名,首先使用“:”进行拆分,获得$message和$hmac,然后使用检查真实性

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

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

是的,但我也会输入一个“seed/”密码,父级和源级都会有这个密码,这样哈希就不会被猜测了。好的,在阅读了UUID之后,是的,我会使用UUID。但这并不能解决问题。URL仍然公开。请使用
hash_equals
,因为PHP中没有
hash_compare
函数。