可以使用hmac从电子邮件链接验证用户身份

时间:2014-04-08 07:48:11

标签: php actionlink hmac

我不确定共享密钥发生在哪里。

我希望用户在使用电子邮件中的操作链接登录时,可以针对不同的页面进行身份验证。验证后,密钥将从数据库中删除。

几个问题

  1. 这是我需要在电子邮件中发送的内容,我是否需要将秘密随机化
  2. 我是否存储哈希并将秘密保持在常量
  3. 将收到的哈希值与数据库进行比较 第二个比较关联的用户ID与解码的用户ID

  4. db字段需要的长度

    $ hmac = echo hash_hmac('sha256','userid | timestamp | somedata','tfjtfkmg'); URL?散列= $ HMAC

  5. 我是否使用facebook中的示例代码来验证电子邮件,尽管facebook使用了两个hmacs,一个用于sig,一个用于有效负载和base64。

    这是正确的吗?

    function parse_signed_request($signed_request) {
      list($encoded_sig, $payload) = explode('.', $signed_request, 2); 
    
      $secret = "appsecret"; // Use your app secret here
    
      // decode the data
      $sig = base64_url_decode($encoded_sig);
      $data = json_decode(base64_url_decode($payload), true);
    
      // confirm the signature
      $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
      if ($sig !== $expected_sig) {
        error_log('Bad Signed JSON signature!');
        return null;
      }
    
      return $data;
    }
    
    function base64_url_decode($input) {
      return base64_decode(strtr($input, '-_', '+/'));
    }
    

1 个答案:

答案 0 :(得分:1)

首先;生成哈希时没有共享密钥这样的东西。

quote

  

散列函数主要用于生成固定长度的输出数据,该数据充当对原始数据的缩短引用。当原始数据过于繁琐而无法完整使用时,这非常有用。

quote again

  

共享密钥可用于身份验证(例如,当登录到远程系统时)或者可以将其提供给密钥派生函数以生成一个或多个用于加密的密钥

所以基本上哈希算法有很多用途,而生成受保护的链接并不是原来的意思,但是很好用!但

共享密钥(或公共密钥)(最常见)用于生成文件(或消息)的加密版本,只能由共享秘密的创建者使用其私有密钥(私钥)进行解密。 。抱歉,不能过于广泛,因为有太多的话要说明这个问题:)如果你想了解更多信息,请先阅读上面引用的来源。


现在回到你的问题。在加密某些内容时,您必须问自己的第一个问题是,有人想要加密信息(或者想要在您的情况下进入)有多糟糕。在加密方面,没有“坚不可摧的”这样的东西,但最好的加密算法需要花费很长时间才能破解人们甚至不尝试。

在你的情况下,只要确保很难猜测'哈希(更精确;猜测用于创建它的参数)。例如,您可以使用以毫秒为单位的时间,随机盐等。但请确保稍后可以检索您使用的每个参数,例如。通过将其存储在生成的哈希本身旁边的数据库中。在示例中,存储用户IP在这里不是有用的,因为用户可以在他的办公室请求登录哈希,回到家,并点击那里的链接。然后,由于他的知识产权发生了变化,链接突然变得无效了。

长话短说,你问题的答案:基本上你必须发送一个只能由你自己复制的字符串(哈希)。为此 - 您 - 只需 - 知道用于创建哈希的参数类型。因此,每个参数都需要存储在数据库中,或者可以以其他方式复制。 所以,是的,我建议你随机化每个链接的秘密,但记得存储它,例如。在数据库中的哈希本身旁边。

您收到的哈希值应与数据库中的哈希值进行比较,最好还要检查到期日期/时间(只需将{generation time} + 3600 seconds存储在数据库中,并将其与用户登录系统的时间进行比较。在/减少3600秒以增加/减少用户可以使用链接登录的时间窗口。

您的上一个问题(比较相关的用户ID)并不相关,因为您无法解码哈希值。

数据库字段的长度取决于。对于sha2,你需要64个字符,md5 32个字符,还有其他字符。