我正在尝试使用 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代码中,签名后使用的是Base64.encodeBase64URLSafeString,而在Golang代码中,你使用的是base64.URLEncoding。
要对齐两种实现中的编码,请在 Golang 中使用 Base64.URLEncoding,如下所示:
return base64.RawURLEncoding.EncodeToString(signature), nil