我必须编写 PHP 程序来完成与 java 签名功能相同的功能,如下
public static String sign(byte[] data, String privateKey) throws Exception {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(data);
byte[] hashData = messageDigest.digest();
StringBuffer hexString = new StringBuffer();
byte[] keyBytes = Base64Utils.decode(privateKey.getBytes());
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Signature signature = Signature.getInstance("NONEWithRSA");
signature.initSign(privateK);
signature.update(hashData);
byte[] sign = signature.sign();
return Base64.getEncoder().encodeToString(sign);
}
我在google上做了一些研究,并尝试编写如下的PHP代码
public function sign($data, $privateKeyString){
$privateKey = openssl_pkey_get_private($privateKeyString);
$hashData = hash("sha256",$data);
openssl_sign($hashData, $signature, $privateKey);
openssl_free_key($privateKey);
return base64_encode($signature);
}
我尝试将相同的密钥与数据一起传递,让我们对功能和测试说“你好” 哈希数据是映射,但结果签名不同
有谁能找出导致java和php返回base64签名不同的原因吗?
public function sign($data, $privateKeyString){
$privateKey = openssl_pkey_get_private($privateKeyString);
$hashData = openssl_digest("sha256",$data);
openssl_private_encrypt($hashData, $signature, $privateKey);
openssl_free_key($privateKey);
return base64_encode($signature);
}
最后通过使用 openssl_digest "sha256" 而不是将 sha256 哈希值传递到私钥加密中来解决问题,因为哈希值需要转换为十六进制字符串而不是原始值。
这段代码可能对你的 PHP 有所帮助:
openssl_sign($yourInputString,$signature,$params['privateKey'],OPENSSL_ALGO_SHA256); $signature = base64_encode($signature);