所以我尝试验证使用php库phpseclib v3在golang中签名的rsa-ps签名。 php 验证总是给我一个错误。但让我困惑的是,当我尝试在 php 中签名并验证它在 golang 和 php 中是否有效时。
这是我在 golang 中用于签名和验证签名的代码
签名
rng := rand.Reader
rsa.SignPSS(rng, key, crypto.SHA256, digest, nil)
验证签名
rsa.VerifyPSS(key, crypto.SHA256, digest, signature, nil)
这是在php中验证和签名的代码
验证签名
$key = RSA::loadPublicKey('the key');
$result = $key->withHash('sha256')->withMGFHash('sha256')->verify($message, $signature);
签名
$key = RSA::loadPrivateKey('the key');
$key = $private->withPadding(RSA::SIGNATURE_PSS);
$signature = $private->withHash('sha256')->withMGFHash('sha256')->sign($message);
注意 签名的值以加密的base64形式返回,我在验证签名之前已经解密了该值
任何人都可以解释这是怎么发生的吗?我应该怎么做才能使其适用于两者?
SignPSS()
调用中,第 5 个参数被指定为 nil
,因此 saltLength()
给出 PSSSaltLengthAuto
,从而应用最大可能的盐长度。signature length - digest output length - 2
(以字节为单位)(例如,使用 2048 位签名/密钥长度和 SHA256 作为摘要:256 - 32 - 2
字节。
在 PHP 代码中,默认使用摘要输出长度(SHA256 为 32 字节)作为盐长度 s。 这里。因此,为了让 PHP 代码验证 Go 代码的签名,必须使用
withSaltLength()
: 将盐长度显式设置为最大大小
$key = PublicKeyLoader::load($pubKey);
$result = $key
->withHash('sha256')
->withMGFHash('sha256')
->withSaltLength(256 - 32 - 2) // Fix! Replace 256 with your signature / key length in bytes
->verify($message, $signature);
print($result ? 'valid signature' : 'invalid signature'); // valid signature