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分钟,并验证哈希。对我来说,这听起来像是您实际上想要创建某种令牌,