Golang Go语言中 求助,签名数据放入数字信封问题

发布于 1周前 作者 yuanlaile 来自 Go语言

Golang Go语言中 求助,签名数据放入数字信封问题

之前在 java 用 bouncycastle 库对数据进行 SHA1withRSA 签名后,将签名放置到数字信封里。 现在要用 go 重写这段代码,但是谷歌好久也找不到该如何实现,求助该如何实现。

java 代码如下:

            CertDTO certDto = CertUtil.getCertInfo(password, cert);
            X509Certificate cerx509 = certDto.getCert()[0];
            List<X509Certificate> certList = new ArrayList();
            CMSTypedData msg = new CMSProcessableByteArray(data);
            certList.add(cerx509);
            Store certs = new JcaCertStore(certList);
            CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
            ContentSigner sha1Signer = (new JcaContentSignerBuilder("SHA1withRSA"))
                .setProvider("BC").build(certDto.getPriKey());
            gen.addSignerInfoGenerator((new JcaSignerInfoGeneratorBuilder((
                new JcaDigestCalculatorProviderBuilder())
                .setProvider("BC").build())).build(sha1Signer, cerx509));
            gen.addCertificates(certs);
            CMSSignedData sigData = gen.generate(msg, isDetach);
            signedData = sigData.getEncoded();


更多关于Golang Go语言中 求助,签名数据放入数字信封问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

搜“golang SHA1withRSA”不就有了。

更多关于Golang Go语言中 求助,签名数据放入数字信封问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


进行签名后还需要生成带有签名的数字信封,就是这里卡到了……

似乎没有数字信封这种通用说法,你可能需要针对他的格式自己拼信封。一般的信封都是消息本体+消息的签名,可能再有点其他字段参与运算。你需要看 java 版怎么封信的实现

生成带有签名的数字信封——应该就是用公钥加密一下,对应的关键词是“golang public private key encryption”

在Golang中,将签名数据放入数字信封通常涉及两个主要步骤:生成和验证数字签名,以及使用公钥加密(信封)来封装这些签名数据。以下是一个简要的步骤指南和代码示例:

  1. 生成数字签名: 使用私钥对数据进行签名。确保你有一个RSA或ECDSA私钥。

    package main
    
    import (
        "crypto/rand"
        "crypto/rsa"
        "crypto/sha256"
        "crypto/x509"
        "encoding/pem"
        "fmt"
        "io/ioutil"
        "os"
    )
    
    func main() {
        // 读取私钥
        privKey, err := ioutil.ReadFile("private.pem")
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }
    
        block, _ := pem.Decode(privKey)
        if block == nil {
            fmt.Println("failed to decode PEM block containing private key")
            os.Exit(1)
        }
    
        parsedKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }
    
        hash := sha256.Sum256([]byte("message"))
        signature, err := rsa.SignPKCS1v15(rand.Reader, parsedKey, crypto.SHA256, hash[:])
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }
    
        // 现在你有了一个签名,可以将其放入数字信封中
        // ...
    }
    
  2. 使用公钥加密签名(数字信封): 使用接收方的公钥加密签名数据。这可以通过rsa.EncryptPKCS1v15或更安全的rsa.OAEPSHA256方法完成。

    注意:完整代码应包括错误处理和必要的库导入。此示例为简化版,旨在提供基本思路。

回到顶部