PHP RSA签名变量未验证

时间:2018-02-19 20:19:00

标签: php base64 rsa signature phpseclib

我有两个功能。一个函数为某些数据生成签名。另一个函数验证数据的签名。我面临的问题是验证不会返回true。我正在使用phpseclib库http://phpseclib.sourceforge.net/rsa/2.0/examples.html

    public function generate(){
    $rsa = new RSA();
    /*$rsa->setPublicKeyFormat(RSA::PRIVATE_FORMAT_PKCS1);
    extract($rsa->createKey());
    return "$publickey\r\n\r\n$privatekey";*/

    $rsa->loadKey(base64_decode(env('RSA_PRIVATE_KEY')));

    $data = 'hello';

    $rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
    $signature = $rsa->sign($data);

    return base64_encode($signature);

}

public function verify(Request $request){
    $rsa = new RSA();

    $data = 'hello';

    $signature = 'HTwI8TU9tIGBSUOWxCI95oILWxdnY9K9rizZbusQMM5+vlD4IiFuU5YghWnRTO+zB4GKUxhOcEaf127X5Hs7m4M76etol7dxxxkFw8097OWuU+bh2YskFB2GLWjzRdamg7RyWYznlePyBlPH8QeBHiRMvHHivabGOmNTkgsF09E=';

    $rsa->loadKey(base64_decode(env('RSA_PUBLIC_KEY'))); // public key
    return $rsa->verify($data, base64_decode($signature)) ? 'verified' : 'unverified';

}

如果我将这两个函数组合成一个这样的函数,它可以正常工作。

    $rsa = new RSA();
    /*$rsa->setPublicKeyFormat(RSA::PRIVATE_FORMAT_PKCS1);
    extract($rsa->createKey());
    return "$publickey\r\n\r\n$privatekey";*/

    $rsa->loadKey(base64_decode(env('RSA_PRIVATE_KEY')));

    $data = 'hello';

    $rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
    $signature = $rsa->sign($data);

    $signature = base64_encode($signature);

    $rsa->loadKey(base64_decode(env('RSA_PUBLIC_KEY'))); // public key
        return $rsa->verify($data, base64_decode($signature)) ? 'verified' : 'unverified';

我不明白。我已经测试了很多方法,签名是相同的,但没有验证。我正在尝试在一个API端点上签名并在另一个端点上进行验证。

1 个答案:

答案 0 :(得分:1)

verify函数中,您没有这样做:

$rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);

您是在generate函数中执行的,而不是verify函数。

在组合函数中,正在使用相同的签名模式,因为正在使用相同的对象。