我在go和php对相同内容 进行签名出来的结果一致是不一致的?
请问有没有大神给解答一下啊
-------------------------------------------------------------------------------------------
$data = "Hello, world!"; // 要签名的数据
// 你的 PKCS#1 格式的 RSA 私钥
$privateKeyPEM = '-----BEGIN PRIVATE KEY-----
MIIJQgIBADANBgkqhk
-----END PRIVATE KEY-----';
计算数据的 SHA-256 哈希
$hash = hash('sha256', $data, true);
// 使用私钥进行签名
$privateKey = openssl_pkey_get_private($privateKeyPEM);
if ($privateKey === false) {
echo "Error loading private key\n";
} else {
$signature = null;
openssl_sign($hash, $signature, $privateKey, OPENSSL_ALGO_SHA256);
// 将签名转换为 base64 编码字符串
$base64Signature = base64_encode($signature);
echo "Signature (base64 encoded): " . $base64Signature . "\n";
}
-------------------------------------------------------------------------------------------------------------------------------------------------
data := "Hello, world!" // 要签名的数据
PKCS#8 格式的 RSA 私钥 (这里使用示例私钥,请替换为实际私钥)
pkcs8PrivateKeyPEM := `-----BEGIN PRIVATE KEY-----
MIIJQgIBADANBgkqhkiG9w0
-----END PRIVATE KEY-----`
// 解码 PKCS#8 格式的私钥
block, _ := pem.Decode([]byte(pkcs8PrivateKeyPEM))
if block == nil {
log.Fatal("Failed to parse PEM block containing the private key")
}
// 使用 x509 解析 PKCS#8 格式的私钥
privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
log.Fatalf("Failed to parse private key: %v", err)
}
// 将私钥断言为 *rsa.PrivateKey
rsaPrivateKey, ok := privateKey.(*rsa.PrivateKey)
if !ok {
log.Fatal("Not an RSA private key")
}
// 计算数据的 SHA-256 哈希
hashed := sha256.Sum256([]byte(data))
// 对哈希数据进行签名
signature, err := rsa.SignPKCS1v15(rand.Reader, rsaPrivateKey, crypto.SHA256, hashed[:])
if err != nil {
log.Fatalf("Failed to sign data: %v", err)
}
b64sig := base64.StdEncoding.EncodeToString(signature)
// 打印签名
fmt.Printf("Signature: %s\n", b64sig)
更多评论
看到`rand.Reader`没,我觉得就是获取随机数据源不同,因此每次签名结果都不一样。我觉得你应该用php签名用go验签,用go签名用php验签,这样成功就行。
#1