Php 如何在两台独立的服务器之间创建共享密钥凭证代码系统?

Php 如何在两台独立的服务器之间创建共享密钥凭证代码系统?,php,encryption-symmetric,Php,Encryption Symmetric,鉴于此工作流: 服务器A $voucher = generateVoucherCode("someSharedSecret"); 用户验证 用户使用共享密钥购买随机生成的唯一凭证代码,以使用服务器B上的应用程序 服务器B $isValid = validateVoucherCode($userInputtedCode, "someSharedSecret"); if($isValid) { // allow access to application } 用户验证 用户输入凭证代码

鉴于此工作流:

服务器A

$voucher = generateVoucherCode("someSharedSecret");
  • 用户验证
  • 用户使用共享密钥购买随机生成的唯一凭证代码,以使用服务器B上的应用程序
  • 服务器B

    $isValid = validateVoucherCode($userInputtedCode, "someSharedSecret");
    if($isValid) {
        // allow access to application
    }
    
  • 用户验证
  • 用户输入凭证代码
  • 服务器B使用共享机密验证代码是否合法
  • 服务器B授予对应用程序的访问权
  • 我需要用PHP实现函数
    generateVoucherCode
    validateVoucherCode
    ,如下所示:

    服务器A

    $voucher = generateVoucherCode("someSharedSecret");
    
    服务器B

    $isValid = validateVoucherCode($userInputtedCode, "someSharedSecret");
    if($isValid) {
        // allow access to application
    }
    

    通过共享秘密验证合法性是我们的目的。您可以通过以下方式在PHP中生成HMAC。您的工作流程将是:

  • 服务器A生成一次性代码(以您想要的任何方式)并计算其HMAC。代码+HMAC对作为凭证代码提供给用户
  • 用户向服务器B出示凭证
  • 服务器B将一次性代码与凭证隔离,并使用共享密钥独立计算其HMAC。如果计算的HMAC与凭证中的HMAC匹配,则凭证是真实的
  • 凭证生成示例:

    $secret = '$uper$ecret$tring';
    $code = 'a pet unicorn';
    $voucher = $code.'/'.hash_hmac('sha512', $code, $secret);
    
    echo 'Your voucher is '.$voucher';
    
    凭证验证示例:

    $secret = '$uper$ecret$tring';
    list ($code, $hmac) = explode('/', $voucher);
    $verify_hmac = hash_hmac('sha512', $code, $secret);
    if ($hmac === $verify_hmac) {
        echo 'Your voucher can be redeemed for '.$code';
    }
    else {
        echo 'Invalid voucher, sorry';
    }
    
    我建议提供一个双方都可以交谈的服务(无论是在a还是B上——这都不重要)。这样,将来您就可以灵活地使用服务器C、服务器D等,并在需要时移动服务本身。