【问题标题】:sign a SHA-256 hash with DSA in Go在 Go 中使用 DSA 签署 SHA-256 哈希
【发布时间】:2021-10-29 17:24:29
【问题描述】:

我想用 DSA 签署一个 SHA-256 哈希。

使用 Java 我可以编写:

 Signature sig = Signature.getInstance("SHA256withDSA");
 sig.initSign(priKey);
 sig.update(new byte[]{1});
 byte[] sign = sig.sign();
 System.out.println(HexUtil.encodeHexStr(sign));

使用 Go 语言,我找不到任何解决方法

【问题讨论】:

标签: java go sha256 dsa


【解决方案1】:

检查DSAWithSHA256签名的唯一实例是在github.com/avast/apkverifier

    case x509.DSAWithSHA256:
        hash := sha256.Sum256(signed)
        pub := cert.PublicKey.(*dsa.PublicKey)
        reqLen := pub.Q.BitLen() / 8
        if reqLen > len(hash) {
            return fmt.Errorf("Digest algorithm is too short for given DSA parameters.")
        }
        digest := hash[:reqLen]

        dsaSig := new(dsaSignature)
        if rest, err := asn1.Unmarshal(signature, dsaSig); err != nil {
            return err
        } else if len(rest) != 0 {
            return errors.New("x509: trailing data after DSA signature")
        }
        if dsaSig.R.Sign() <= 0 || dsaSig.S.Sign() <= 0 {
            return errors.New("x509: DSA signature contained zero or negative values")
        }
        if !dsa.Verify(pub, digest, dsaSig.R, dsaSig.S) {
            return errors.New("x509: DSA verification failure")
        }

但实际上使用签名算法确实不受支持,原因在github.com/grantae/certinfo中说明

问题:

  1. 不幸的是,OpenSSL 对 DSA 和 ECDSA 证书请求使用非确定性签名,因此尽管有静态密钥,但运行 make-certs.sh 不会重现相同的 CSR。
    这些文件必须手动保持同步。

  2. x509 包目前没有为 DSA CSR 设置 CertificateRequest.SignatureAlgorithm
    因此,“leaf2.csr.text”包含“Signature Algorithm: 0”行 而不是 'Signature Algorithm: DSAWithSHA256' 以允许测试通过并表明问题出在 x509 而不是这个包。

因此它的 unsupported status 在 Go crypto/x509 包中。

【讨论】:

  • 我知道,这种方式只是验证,我想知道如何签名。
  • 在其他方面,sha256 then dsa 和 sha256withrsa 有什么区别
  • 请看我的另一个问题,我发现 golang dsa 与 java dsa 的区别 stackoverflow.com/questions/69009710/…
猜你喜欢
  • 2014-08-19
  • 2023-03-18
  • 2013-01-09
  • 2011-04-18
  • 2016-08-01
  • 2012-09-12
  • 2017-09-20
  • 1970-01-01
  • 2017-02-24
相关资源
最近更新 更多