java - 在 Java 中生成的 C# 中的验证 RSA 签名
问题描述
我有一个签名字符串,Base64 编码,json 中的消息字符串和公钥字符串 - 假设它是用 Java 生成的 base64 编码,我需要在 C# 中验证它。
我也有一个 Java 代码,它应该正确地进行验证,但我无法让它在 C# 中运行。请帮助如何做到这一点?
import java.security.spec.X509EncodedKeySpec;
import org.apache.commons.codec.binary.Base64;
public class WebHookSecurityUtil
{
private static final String KEYPAIR_ALGORITHM = "RSA"; // No I18N
private static final String SIGNATURE_ALGORITHM = "SHA256withRSA"; // No I18N
private static final String CHARSETNAME = "UTF-8"; // No I18N
public static boolean verifySignature(String text, String public_key_str, String signature_str) throws Exception
{
PublicKey public_key = getPublicKey(public_key_str);
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(public_key);
signature.update(text.getBytes(CHARSETNAME));
byte[] signatureBytes = Base64.decodeBase64(signature_str);
return signature.verify(signatureBytes);
}
public static PublicKey getPublicKey(String public_key) throws Exception
{
byte[] bytes = Base64.decodeBase64(public_key);
X509EncodedKeySpec ks = new X509EncodedKeySpec(bytes);
KeyFactory kf = KeyFactory.getInstance(KEYPAIR_ALGORITHM);
return kf.generatePublic(ks);
}
}
我尝试的是它总是返回false
。
RSAParameters pubKey = new RSAParameters();
// Not sure here...
pubKey.Modulus =Convert.FromBase64String(publicKey);
pubKey.Exponent = new byte[] { 1, 0, 1 };
byte[] buffer = System.Text.UTF8Encoding.UTF8.GetBytes(msg);
byte[] sig = Convert.FromBase64String(signature);
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.ImportParameters(pubKey);
bool isValid = provider.VerifyData(buffer, CryptoConfig.MapNameToOID("SHA256"), sig);
Console.WriteLine("SHA256: " + isValid);
解决方案
在 base 64 编码之后,您需要从这里开始执行代码DecodeX509PublicKey
。Mickeysoft 不支持在 X.509 证书和 PUBLIC KEY PEM 结构中使用的“SubjectPublicKeyInfo”结构,因为它不支持标准,更喜欢它们自己的格式。虽然它开始改变,但非常缓慢。
推荐阅读
- c++ - 在c ++中不使用*运算符将十进制值相乘
- r - 在 Shiny 中,req() 和 if() 语句有什么区别?
- reactjs - 如何从所有组件的 componentDidMount 调用函数
- javascript - 检查多个字符串更短,JS?
- python - 如何创建具有时间序列 xaxis 降序的图?
- python - 在 matplotlib 中将 CheckButtons 重置为原始值
- css - 使用 VUE 组件的 CSS DIV 对齐问题
- c - 从函数返回的奇怪的 int
- r - 如何将小时分钟字符格式转换为 POSIXlt 格式?
- apache - Collabora (docker) 和 NextCloud (snap) 问题在同一台机器上的代理后面