go RSA sgin 和 php openssl_sign 不是互通的么 ?

sub_876786132 · 2023-10-17 15:40:18 · 1347 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2023-10-17 15:40:18 的主题,其中的信息可能已经有所发展或是发生改变。

我在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)

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1347 次点击  
加入收藏 微博
2 回复  |  直到 2023-10-18 11:22:39
jan-bar
jan-bar · #1 · 2年之前

看到rand.Reader没,我觉得就是获取随机数据源不同,因此每次签名结果都不一样。我觉得你应该用php签名用go验签,用go签名用php验签,这样成功就行。

tuzhiya
tuzhiya · #2 · 2年之前

签名出来的数据不可能一样的,rsa需要用验证方法判断

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传