Php 创建只能在接下来5分钟内验证的哈希

Php 创建只能在接下来5分钟内验证的哈希,php,security,hash,Php,Security,Hash,我想做一个算法,在这个算法中,我们可以基于字符串创建一个哈希,这个字符串只能在接下来的5分钟内验证 我们班有三种方法: make:它将根据字符串并考虑当前的时间生成哈希,因此可以使用我们自己的验证方法仅在接下来的5分钟内对其进行验证 验证:我们收到一个字符串和一个散列值,我们检查散列是否基于之前5分钟内生成的字符串 魔法就在这里发生了:对不起,我真的想不出解决这个问题的办法,已经谷歌搜索过了。下面是我们的代码,它基于字符串生成散列,并考虑当前时间,但以浮点方式 <?php namespa

我想做一个算法,在这个算法中,我们可以基于
字符串创建一个哈希,这个字符串只能在接下来的5分钟内验证

我们班有三种方法:

make:它将根据
字符串
并考虑当前的
时间
生成哈希,因此可以使用我们自己的
验证
方法仅在接下来的5分钟内对其进行验证

验证:我们收到一个
字符串
和一个
散列
值,我们检查
散列
是否基于之前5分钟内生成的
字符串

魔法就在这里发生了:对不起,我真的想不出解决这个问题的办法,已经谷歌搜索过了。下面是我们的代码,它基于
字符串生成
散列
,并考虑当前时间,但以浮点方式

<?php

namespace App\Secure;

class timeHash
{

    public static function make ($str)
    {
        return static::magic_happens_here($str);
    }

    public static function validate ($str, $hash)
    {
        return $this->magic_happens_here($str) == $hash;
    }

    public static function magic_happens_here ($str)
    {
        //!
    }

}

您可以在字符串中添加一个数字,以5分钟为单位显示当前时间

5=1 | 10=2 | 15=3

18:15=“183” 13:45=“139”

您还应该添加日期

这将给您一个5分钟的时间框架来验证哈希,但该框架的开始是由时间定义的,而不是由哈希的生成来定义的


我认为应该有更好的方法。您可以在字符串中添加一个数字,以5分钟为单位显示当前时间

5=1 | 10=2 | 15=3

18:15=“183” 13:45=“139”

您还应该添加日期

这将给您一个5分钟的时间框架来验证哈希,但该框架的开始是由时间定义的,而不是由哈希的生成来定义的


我认为应该有更好的方法。只需将时间戳作为可读值包含在哈希中,并将其包含在哈希中,以便验证其真实性。为此,你应该使用一个

                          hash
                    vvvvvvvvvvvvvvvv
$hash = '1234567890:abcdef1234567890'
         ^^^^^^^^^^
         timestamp

作为散列数据使用的内容(此处:仅为时间戳)和
$secretKey
取决于您要验证的确切数据。要进行验证,您可以轻松地从哈希中删除时间戳,验证它是否在现在的5分钟内,并重复相同的哈希操作以确认哈希值

记住:如果没有密钥,任何人显然都可以伪造这样的散列。密钥是只有您知道的东西,它证明您最初创建了散列


您也可以出于同样的目的进行研究。

只需将时间戳作为可读值包含在哈希中,并将其包含在哈希中,以便验证其真实性。为此,你应该使用一个

                          hash
                    vvvvvvvvvvvvvvvv
$hash = '1234567890:abcdef1234567890'
         ^^^^^^^^^^
         timestamp

作为散列数据使用的内容(此处:仅为时间戳)和
$secretKey
取决于您要验证的确切数据。要进行验证,您可以轻松地从哈希中删除时间戳,验证它是否在现在的5分钟内,并重复相同的哈希操作以确认哈希值

记住:如果没有密钥,任何人显然都可以伪造这样的散列。密钥是只有您知道的东西,它证明您最初创建了散列


您也可以出于同样的目的来研究这个问题。

我认为您的数据blob(散列)需要有一个状态(“活动”/“过期”或类似状态)

如果状态直接绑定到时间戳,并且没有在散列之外提供该时间戳,则没有人可以更改状态。这是因为散列是不可逆的。因此,作为结论,您需要将时间戳存储在某个位置,以便能够更改状态

如果不想向接收器显示时间戳,则有两个选项:

  • 对其进行加密,以便只有您拥有加密密钥
  • 根本不向接收方发送时间戳-只发送哈希。将时间戳和哈希对表存储在服务器上
  • 现在对我来说,选择其中一个选项似乎很容易:如果您的服务器是无状态的,那么选择选项1。另一方面,如果您的服务器不是无状态的,并且您有一个数据库或其他方式来持久化数据,请选择选项2

    在任何情况下,都应将时间戳与要哈希的字符串一起包含在哈希中,以确保数据的真实性,并使用HMAC。我也会考虑用随机值对散列进行腌制。
    最后,在服务器上的验证函数中,从记录中检查与接收到的散列配对的时间戳是否不超过5分钟,并验证散列。

    我认为您的数据blob(散列)需要有一个状态(“活动”/“过期”或类似状态)来解决这个问题

    如果状态直接绑定到时间戳,并且没有在散列之外提供该时间戳,则没有人可以更改状态。这是因为散列是不可逆的。因此,作为结论,您需要将时间戳存储在某个位置,以便能够更改状态

    如果不想向接收器显示时间戳,则有两个选项:

  • 对其进行加密,以便只有您拥有加密密钥
  • 根本不向接收方发送时间戳-只发送哈希。将时间戳和哈希对表存储在服务器上
  • 现在对我来说,选择其中一个选项似乎很容易:如果您的服务器是无状态的,那么选择选项1。另一方面,如果您的服务器不是无状态的,并且您有一个数据库或其他方式来持久化数据,请选择选项2

    在任何情况下,都应将时间戳与要哈希的字符串一起包含在哈希中,以确保数据的真实性,并使用HMAC。我也会考虑用随机值对散列进行腌制。
    最后,在服务器上的验证函数中,从记录中检查与接收到的哈希配对的时间戳是否不超过5分钟,并验证哈希。

    对我来说,这听起来像是您实际上想要创建某种令牌,