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

时间:2017-06-29 07:29:45

标签: php security hash

我想制作一个算法,我们可以根据string创建一个只能在接下来的5分钟内验证的哈希值!

所以我们的班级有3种方法:

制作:这将根据string制作哈希值并考虑​​当前time,因此可以使用我们自己的validate方法对其进行验证只在接下来的5分钟内。

验证:我们收到stringhash值,我们会检查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分钟前的所有可能值,并将其与提供的哈希值进行比较,但这没有任何意义;还没有其他解决方案吗?

4 个答案:

答案 0 :(得分:4)

只需在哈希中包含时间戳作为可读值,将其包含在哈希中,以便验证其真实性。您应该使用HMAC来实现此目的。

$time = time();
$hash = "$time:" . hash_hmac('sha256', $time, $secretKey);

$secretKey

您用作散列数据(此处:只是时间戳)和 Zend\View\Renderer\PhpRenderer::render: Unable to render template &quot;application/command/fire-curl-request/index&quot;; resolver could not resolve to a file 的内容取决于您尝试校对的确切数据。要验证您可以轻松地从哈希中删除时间戳,请在5分钟内验证它,并重复相同的哈希操作以确认哈希值。

请记住:没有密钥,任何人显然都能够制作这样的哈希。秘密密钥只是知道的东西,并证明最初创建了哈希。

您也可以查看JSON Web Tokens的目的非常相同。

答案 1 :(得分:3)

我会通过认为您的数据blob(哈希)需要具有状态(&#34;活动&#34; /&#34;过期&#34;或类似)来解决此问题。

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

如果您不想向收件人显示时间戳,您有两种选择:

  1. 对其进行加密,以便只有加密密钥
  2. 根本不要将时间戳发送到接收器 - 只发送哈希值。保持时间戳&amp;存储在服务器上的哈希对表。
  3. 现在对我而言,选择以下选项之一很容易:如果您的服务器是无状态的,请选择1.另一方面,如果您的服务器不是无状态且您有数据库或其他方法来保留数据,请转到选项2。

    在任何情况下,包括哈希中的时间戳以及要散列的字符串以获得数据的真实性,并使用HMAC。我也会考虑用随机值来腌制哈希值。

    最后在服务器上的验证功能中,从记录中检查与收到的哈希值配对的时间戳不超过5分钟并验证哈希值。

答案 2 :(得分:1)

对我而言,这听起来像你真的想要创建一种令牌,可以像票证一样使用一段时间。

如果您需要应用程序是无状态的(无法使用数据库),那么@deceze应该是可行的方法,时间戳必须可以从哈希字符串中检索,但也必须用作HMAC函数的输入参数

如果您的应用程序可以访问数据库,则可以更安全的方式解决问题。在这种情况下,您可以创建随机令牌并将其哈希与创建时间戳一起存储在数据库中。令牌本身将以明文形式发送给用户。

优点是,即使攻击者在服务器上获得权限,他也无法对令牌做任何事情。生成新的有效令牌没有隐藏密钥,它们不包含任何信息,只包含随机字符。

答案 3 :(得分:-1)

您可以在字符串中添加一个数字,以5分钟的步长显示当前时间。

5 = 1 | 10 = 2 | 15 = 3 ....

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

您还应该添加日期。

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

我认为应该有更好的方法来做到这一点。