在 PHP 中编码方法 RS256
Posted
技术标签:
【中文标题】在 PHP 中编码方法 RS256【英文标题】:Encode Method RS256 in PHP 【发布时间】:2020-05-15 02:18:02 【问题描述】:我必须做一个原生 JWT 密钥方法,我必须使用 RSA256 方法,但是当我尝试这个时:
$sha256 = hex2bin("3031300d060960864801650304020105000420").hash("sha256",$data,true);
$encrypt_rsa = openssl_private_encrypt($sha256, $partialEncrypted, $privateKey, OPENSSL_PKCS1_PADDING);
$encrypted .= $partialEncrypted;
它返回给我:
]YXzn_U]f
" >@ќw
-<Bt
TD6W7 y͜CE ^fa~N5[l<%xn1b>Eh3j0D,eL5]q$Vpg
fq/;~g7>r0M3Հ$WMA;?Y̶g DA|v7܄C%wɑ7mh L
当我尝试使用该方法进行解码时:
$decrypt_rsa = openssl_public_decrypt($function_rsa, $partialDecrypted, $certificate, OPENSSL_PKCS1_PADDING);
$decrypted .= $partialDecrypted;
它什么也没给我。
我知道我的编码方法有错误,但我不知道为什么。
谢谢:)
【问题讨论】:
您查看openssl_error_string() 是否发现错误? 是的,它是空的 任何解决方案? 【参考方案1】:$sha256
包含不可打印的字符,因此应使用正确的编码显示,例如十六进制使用bin2hex
。这也适用于$encrypted
。 $function_rsa
当前未定义。假设这是一个复制/粘贴错误并且$function_rsa
对应$encrypted
,代码有效,即$decrypted
等于$sha256
:
<?php
// Create a test key pair
$keypair = openssl_pkey_new(array("private_key_bits" => 2048));
openssl_pkey_export($keypair, $privateKey);
$publicKey = openssl_pkey_get_details($keypair);
$publicKey = $publicKey["key"];
$data = "The quick brown fox jumps over the lazy dog";
// Encrypt
$encrypted = "";
$sha256 = hex2bin("3031300d060960864801650304020105000420").hash("sha256", $data, true);
$encrypt_rsa = openssl_private_encrypt($sha256, $partialEncrypted, $privateKey, OPENSSL_PKCS1_PADDING);
$encrypted .= $partialEncrypted;
// Decrypt
$decrypted = "";
$decrypt_rsa = openssl_public_decrypt($encrypted, $partialDecrypted, $publicKey, OPENSSL_PKCS1_PADDING);
$decrypted .= $partialDecrypted;
// Compare
print("Original data: " . bin2hex($sha256) . "\nEncrypted data: " . bin2hex($encrypted) . "\nDecrypted data: " . bin2hex($decrypted));
?>
另一个可能的错误来源当然是键。如有必要,请再次检查。
带有前面哈希 ID 的哈希加密对应于使用 RSASSA-PKCS1-v1_5-padding (RFC 8017) 生成哈希的数据的签名。请注意,使用openssl_sign
可以更轻松地生成数据的签名:
$getPrivate = openssl_pkey_get_private($privateKey);
openssl_sign($data, $signature, $getPrivate, "sha256WithRSAEncryption");
print("\nSignature: " . bin2hex($signature));
【讨论】:
以上是关于在 PHP 中编码方法 RS256的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 python 将私钥编码为 RS256 格式的 JSON WEB TOKEN
Azure Api 管理 ValidateJWT 与 Rs256 PrivateKey
JAVA如何解密用PHP加密的base64编码和RIJNDAEL 256的数据?