PHP 和 Javascript JWA 之间的数字签名结果不同



我正在尝试使用RSA 256生成签名,但是在JavaScript和PHP之间得到了不同的结果。

我的 JavaScript 代码:

let private_key_path = Helpers.publicPath('key/API_Portal.pem');
// password .pem file
let password = 'mandiri123';
let data = client_id + "|" + timestamp;
// load private key file
let rsa_algorithm = jwa('RS256');
let privateKey = fs.readFileSync(private_key_path);
let signature = rsa_algorithm.sign(data, {'key': privateKey, 'passphrase': password});
return signature;

输出:

tCB6v9_UnUTNpkeTZwgjn-iepO4XGwhZ72Q7LONarc-wT8pC18gyd46GYT8I1dLwVymPRDOzWwA9XXELRncG-CmYXlrutJssAUKmDv3hMRedbDu7-60OU9haSaBskedPoqlL76CigQXJ8ZX2_gnf8YG2-wALJfD1VquQWinmSUsMAD2bMB_EgDmSlOLrr_5BSKO2Pzq3XpJxcriptl-l6s7SsR_K6Gb1KYyhxmOAm41nKG9i-kUhvyDaZzTQ9Hw1_vqPOJN8gNhj6lnHimwizIOENsOtkIKhwa5QjL1Oa3PtnrMhCaQ9fWsUG83-rPOkbOulB5o12qWTxmeSJVsW8w

我的PHP代码:

// Specify private key location, passphrase, data, and hash algorithm
$private_key_path = public_path('keyAPI_Portal.pem');
// Password .pem file
$password = 'mandiri123';
$data = $this->clientId . '|' . "2020-11-19T11:35:57.190T+0700";
$rsa_algorithm = OPENSSL_ALGO_SHA256;
// Load private key file
$fp = fopen($private_key_path, 'r');
$privatekey_file = fread($fp, 8192);
fclose($fp);
$privatekey = openssl_pkey_get_private($privatekey_file, $password);
// return $privatekey_file;
// Sign data
openssl_sign($data, $signature, $privatekey, $rsa_algorithm);
$result = base64_encode($signature);
return $result;

输出:

tCB6v9/UnUTNpkeTZwgjn+iepO4XGwhZ72Q7LONarc+wT8pC18gyd46GYT8I1dLwVymPRDOzWwA9XXELRncG+CmYXlrutJssAUKmDv3hMRedbDu7+60OU9haSaBskedPoqlL76CigQXJ8ZX2/gnf8YG2+wALJfD1VquQWinmSUsMAD2bMB/EgDmSlOLrr/5BSKO2Pzq3XpJxcriptl+l6s7SsR/K6Gb1KYyhxmOAm41nKG9i+kUhvyDaZzTQ9Hw1/vqPOJN8gNhj6lnHimwizIOENsOtkIKhwa5QjL1Oa3PtnrMhCaQ9fWsUG83+rPOkbOulB5o12qWTxmeSJVsW8w==

PHP中的结果是正确的,为什么两者之间有区别?

根据 JWA 规范的第 3.3 节:

RSA SHA-256 数字签名的生成方式如下:

  1. 使用 RSASSA-PKCS1-V1_5-SIGN 和具有所需私钥的 SHA-256 哈希函数生成 JWS 安全输入的 ASCII 表示字节的数字签名。输出将是一个字节数组。
  2. Base64url 对 生成的字节数组进行编码。

请注意,base64url 编码与 PHP 使用的标准 base64 编码不同。+/替换为-_。只需简单的字符串替换即可使它们相同。

最新更新