Php hmac可用于通过电子邮件链接对用户进行身份验证吗

Php hmac可用于通过电子邮件链接对用户进行身份验证吗,php,actionlink,hmac,Php,Actionlink,Hmac,我真的不确定共享的秘密发生在哪里 我希望用户在使用电子邮件中的操作链接登录时,能够针对不同的页面进行身份验证。验证密钥是否从数据库中删除后 几个问题 这就是我需要在电子邮件中发送的内容吗?我是否也需要随机化这个秘密 我是否存储散列并将秘密保持不变 将收到的哈希值与数据库进行比较, 其次,将关联的userid与解码的userid进行比较 db字段需要多长 $hmac=echo hash_hmac('sha256','userid | timestamp | somedata','tfjtfkmg'

我真的不确定共享的秘密发生在哪里

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

几个问题

  • 这就是我需要在电子邮件中发送的内容吗?我是否也需要随机化这个秘密
  • 我是否存储散列并将秘密保持不变
  • 将收到的哈希值与数据库进行比较,
    其次,将关联的userid与解码的userid进行比较

  • db字段需要多长

    $hmac=echo hash_hmac('sha256','userid | timestamp | somedata','tfjtfkmg'); url?哈希=$hmac

  • 尽管facebook使用了两个HMAC,一个用于sig,一个用于有效载荷,另一个用于base64 it,但我是否使用facebook的示例代码验证电子邮件

    这是正确的吗

    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, '-_', '+/'));
    }
    

    首先,;在生成散列时,不存在共享秘密

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

    而我

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

    所以基本上一个散列算法有很多用途,生成一个受保护的链接不是最初的意思,而是一个很好的用途

    共享密钥(或公钥)通常用于生成文件(或消息)的加密版本,该文件(或消息)只能由共享密钥的创建者使用其私钥(私钥)解密。抱歉,不能太广泛,因为关于这个主题有太多的东西要讲:)如果你想知道更多,从阅读上面引用的来源开始


    现在回到你的问题上来。当加密某些东西时,你必须问自己的第一个问题是,有人想要加密的信息(或者想要进入你的案件)有多糟糕。在加密技术中没有“牢不可破”这类东西,但最好的加密算法需要很长时间才能破解,以至于人们甚至不去尝试

    在您的情况下,只需确保很难“猜测”散列(更精确;猜测用于创建散列的参数)。例如,您可以使用以毫秒为单位的时间、随机salt等,但请确保以后可以检索到您使用的每个参数,例如,将其存储在生成的哈希本身旁边的数据库中。在这个示例中,存储用户IP在这里没有用处,因为用户可以在办公室请求登录哈希,返回家中,然后单击那里的链接。然后突然之间,链接不再有效,因为他的IP“改变了”

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

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

    您的最后一个问题(比较关联的用户id)不相关,因为您无法解码哈希


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

    秘密不仅仅是一个常量,facebook的appsecret也是一个常量吗?是的,当然,它可以是任何你喜欢的。随机化秘密会增加一点安全性(因为有另一个变量用于生成哈希),但如果您愿意,它可以是常量。虽然您无法将其与facebook进行比较,因为机密用于验证应用程序,并生成只能使用私人机密检查的哈希。我不知道facebook正在做什么,但这可能对我来说就够了,因为链接只能使用一次。我将使用一个glob这是一个防止篡改的私人秘密,可能需要很长的字符串来加密熵,尽管我还不能真正理解这个词。谢谢。