Golang 的 RSA 签名与 Java 的不匹配

问题描述 投票:0回答:1

我正在尝试使用 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 代码,我都会收到签名错误。

java go rsa signature pkcs#1
1个回答
0
投票

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

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

return base64.RawURLEncoding.EncodeToString(signature), nil
© www.soinside.com 2019 - 2024. All rights reserved.