我想制作一个算法,我们可以根据string
创建一个只能在接下来的5分钟内验证的哈希值!
所以我们的班级有3种方法:
制作:这将根据string
制作哈希值并考虑当前time
,因此可以使用我们自己的validate
方法对其进行验证只在接下来的5分钟内。
验证:我们收到string
和hash
值,我们会检查hash
是否基于string
之前 5分钟。
magic_happens_here :抱歉,我真的无法为此提出解决方案,已经用Google搜索了。这是我们的代码,用于根据hash
生成string
并考虑当前时间,但是采用浮动方式!?
<?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)
{
//!
}
}
这是可能的!!?我无法想到这样做的方法!
当然我们可以使用timestamp
并计算5分钟前的所有可能值,并将其与提供的哈希值进行比较,但这没有任何意义;还没有其他解决方案吗?
答案 0 :(得分:4)
只需在哈希中包含时间戳作为可读值,和将其包含在哈希中,以便验证其真实性。您应该使用HMAC来实现此目的。
$time = time();
$hash = "$time:" . hash_hmac('sha256', $time, $secretKey);
$secretKey
您用作散列数据(此处:只是时间戳)和 Zend\View\Renderer\PhpRenderer::render: Unable to render template "application/command/fire-curl-request/index"; resolver could not resolve to a file
的内容取决于您尝试校对的确切数据。要验证您可以轻松地从哈希中删除时间戳,请在5分钟内验证它,并重复相同的哈希操作以确认哈希值。
请记住:没有密钥,任何人显然都能够制作这样的哈希。秘密密钥只是你知道的东西,并证明你最初创建了哈希。
您也可以查看JSON Web Tokens的目的非常相同。
答案 1 :(得分:3)
我会通过认为您的数据blob(哈希)需要具有状态(&#34;活动&#34; /&#34;过期&#34;或类似)来解决此问题。
如果状态直接绑定到时间戳,并且您没有在哈希之外提供该时间戳,则没有人可以更改状态。这是因为哈希是不可逆转的。因此,作为结论,您需要将时间戳存储在某处以便能够更改状态。
如果您不想向收件人显示时间戳,您有两种选择:
现在对我而言,选择以下选项之一很容易:如果您的服务器是无状态的,请选择1.另一方面,如果您的服务器不是无状态且您有数据库或其他方法来保留数据,请转到选项2。
在任何情况下,包括哈希中的时间戳以及要散列的字符串以获得数据的真实性,并使用HMAC。我也会考虑用随机值来腌制哈希值。
最后在服务器上的验证功能中,从记录中检查与收到的哈希值配对的时间戳不超过5分钟并验证哈希值。
答案 2 :(得分:1)
对我而言,这听起来像你真的想要创建一种令牌,可以像票证一样使用一段时间。
如果您需要应用程序是无状态的(无法使用数据库),那么@deceze应该是可行的方法,时间戳必须可以从哈希字符串中检索,但也必须用作HMAC函数的输入参数
如果您的应用程序可以访问数据库,则可以更安全的方式解决问题。在这种情况下,您可以创建随机令牌并将其哈希与创建时间戳一起存储在数据库中。令牌本身将以明文形式发送给用户。
优点是,即使攻击者在服务器上获得权限,他也无法对令牌做任何事情。生成新的有效令牌没有隐藏密钥,它们不包含任何信息,只包含随机字符。
答案 3 :(得分:-1)
您可以在字符串中添加一个数字,以5分钟的步长显示当前时间。
5 = 1 | 10 = 2 | 15 = 3 ....
18:15 =“183” 13:45 =“139”
您还应该添加日期。
这会给你一个5分钟的时间框架来验证哈希,但是那个框架的开始是由时间而不是哈希的生成来定义的。
我认为应该有更好的方法来做到这一点。