代码之家  ›  专栏  ›  技术社区  ›  Tselmuun

Golang的RSA签名与Java的不匹配

  •  0
  • Tselmuun  · 技术社区  · 2 年前

    我正在尝试使用PKCS#1v15标准创建RSA签名。数据首先使用MD5进行散列,签名的算法是SHA256。但由于某种原因,两个输出都不同,服务器会为Golang代码抛出一个错误。如有任何建议,我们将不胜感激。

    Java代码:

    对于上下文:

    RSA_ALGORITHM_SIGN=“SHA256WithRSA”;

    CHARSET=“UTF-8”;

    private static String getSign(String data, RSAPrivateKey privateKey) {
        try {
            String encodeStr = DigestUtils.md5Hex(data);
            System.out.println(encodeStr);
            Signature signature = Signature.getInstance(RSA_ALGORITHM_SIGN);
            signature.initSign(privateKey);
            signature.update(encodeStr.getBytes(CHARSET));
            byte[] sign = signature.sign();
            System.out.println(sign.length);
            return Base64.encodeBase64URLSafeString(sign);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    

    Golang代码:

    func GetSignature(data []byte, pk *rsa.PrivateKey) (string, error) {
        m := md5.New()
        _, err := m.Write(data)
        if err != nil {
            return "", err
        }
        encoded := hex.EncodeToString(m.Sum(nil))
        fmt.Println(encoded)
        signature, err := rsa.SignPKCS1v15(rand.Reader, pk, crypto.SHA256, []byte(encoded))
        if err != nil {
            return "", err
        }
        return base64.URLEncoding.EncodeToString(signature), nil
    }
    

    我希望我使用的服务器不会出现错误。然而,无论我如何更改Golang代码,我都会遇到签名错误。

    0 回复  |  直到 2 年前
        1
  •  0
  •   Mosi    2 年前

    在Java代码中,签名后使用Base64.encodeBase64URLSafeString,而在Golang代码中,使用Base64.URLEncoding。

    要在两种实现中对齐编码,请在Golang中使用Base64.URLEncoding,如下所示:

    return base64.RawURLEncoding.EncodeToString(signature), nil
    
        2
  •  0
  •   VHS    2 年前

    您正在使用 rsa.SignPKCS1v15 (PKCS#1v15标准),但Java中的SHA256WithRSA方案。前者需要显式填充方案,而后者使用隐式填充方案。在GoLang代码中,您没有进行显式填充,这会导致Java和Go代码之间的签名生成不一致。在Golang代码中显式填充,如下所示:

    // Create the PKCS #1v15 padding according to the key size
    padding := pkcs1v15Padding(pk.Size(), crypto.MD5)
    
    // Concatenate padding and hashed data
    paddedData := append(padding, []byte(encoded)...)
    
    signature, err := rsa.SignPKCS1v15(rand.Reader, pk, crypto.MD5, paddedData)
    
        3
  •  -2
  •   Tselmuun    2 年前

    所以,我错过了Java方法中的一些内容。

    在Java代码中,工作流程是MD5->十六进制->SHA256->签名在我早期的Golang代码中,我实现了MD5->十六进制->签名

    终于解决了这个问题。感谢所有分享他们集体意见的人。真的帮助我朝着正确的方向前进。

    推荐文章