在 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

在HMAC SHA256中编码字符串[关闭]

Azure Api 管理 ValidateJWT 与 Rs256 PrivateKey

JAVA如何解密用PHP加密的base64编码和RIJNDAEL 256的数据?

VBA:如何根据 VBA 中的私钥生成带有 RS256 的签名?

字符编码详解