Java 验证签名 C# 等价物
Java Validate signature C# equivalent
我正在尝试找到与此 Java 代码等效的代码:
public String signData(String data, String privateKey) {
try {
byte[] bytes = data.getBytes("UTF8");
PKCS8EncodedKeySpec prKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
PrivateKey prKey = KeyFactory.getInstance("RSA").generatePrivate(prKeySpec);
Signature sig = Signature.getInstance("SHA512withRSA");
sig.initSign(prKey);
sig.update(bytes);
byte[] signatureBytes = sig.sign();
return new String(Base64.encodeBase64(signatureBytes));
} catch (Exception ex) {
}
return null;
}
和
public boolean validateSignature(String data, String publicKey, String signature) {
try {
byte[] bytes = data.getBytes("UTF8");
X509EncodedKeySpec pbKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));
PublicKey pbKey = KeyFactory.getInstance("RSA").generatePublic(pbKeySpec);
Signature sig = Signature.getInstance("SHA512withRSA");
sig.initVerify(pbKey);
sig.update(bytes);
return sig.verify(Base64.decodeBase64(signature));
} catch (Exception ex) {
}
return false;
}
此代码似乎不起作用。
可能我错过了什么。
我找了几个类似的帖子,但是没找到答案。
public String signData(String data, String privateKey)
{
byte[] bytes = Encoding.UTF8.GetBytes(data);
var rsa = RSA.Create();
rsa.ImportPkcs8PrivateKey(Convert.FromBase64String(privateKey), out _);
byte[] signedData = rsa.SignData(bytes, HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
return Convert.ToBase64String(signedData);
}
public bool validateSignature(String data, String publicKey, String signature)
{
var bytes = Convert.FromBase64String(publicKey);
var rsa = RSA.Create();
rsa.ImportSubjectPublicKeyInfo(bytes, out _);
var rsaParams = rsa.ExportParameters(false);
return rsa.VerifyHash(Encoding.UTF8.GetBytes(data), Convert.FromBase64String(signature), HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
}
这让我大吃一惊)我希望有人能回答)
谢谢
问题出在调用 VerifyHash()
验证签名的 validateSignature 方法中。第一个参数的名称是 rgbHash
并且 documentation 表示:
Parameters
rgbHash Byte[]
The hash value of the signed data.
此方法用于验证已计算哈希的签名,但您正尝试通过提供数据本身来验证签名,因此将 VerifyHash() 调用更改为 VerifyData() 应该可以解决问题:
public static bool validateSignature(String data, String publicKey, String signature)
{
var bytes = Convert.FromBase64String(publicKey);
var rsa = RSA.Create();
rsa.ImportSubjectPublicKeyInfo(bytes, out _);
// Not used in the provided code.
// var rsaParams = rsa.ExportParameters(false);
return rsa.VerifyData(Encoding.UTF8.GetBytes(data), Convert.FromBase64String(signature), HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
}
我正在尝试找到与此 Java 代码等效的代码:
public String signData(String data, String privateKey) {
try {
byte[] bytes = data.getBytes("UTF8");
PKCS8EncodedKeySpec prKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
PrivateKey prKey = KeyFactory.getInstance("RSA").generatePrivate(prKeySpec);
Signature sig = Signature.getInstance("SHA512withRSA");
sig.initSign(prKey);
sig.update(bytes);
byte[] signatureBytes = sig.sign();
return new String(Base64.encodeBase64(signatureBytes));
} catch (Exception ex) {
}
return null;
}
和
public boolean validateSignature(String data, String publicKey, String signature) {
try {
byte[] bytes = data.getBytes("UTF8");
X509EncodedKeySpec pbKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));
PublicKey pbKey = KeyFactory.getInstance("RSA").generatePublic(pbKeySpec);
Signature sig = Signature.getInstance("SHA512withRSA");
sig.initVerify(pbKey);
sig.update(bytes);
return sig.verify(Base64.decodeBase64(signature));
} catch (Exception ex) {
}
return false;
}
此代码似乎不起作用。 可能我错过了什么。 我找了几个类似的帖子,但是没找到答案。
public String signData(String data, String privateKey)
{
byte[] bytes = Encoding.UTF8.GetBytes(data);
var rsa = RSA.Create();
rsa.ImportPkcs8PrivateKey(Convert.FromBase64String(privateKey), out _);
byte[] signedData = rsa.SignData(bytes, HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
return Convert.ToBase64String(signedData);
}
public bool validateSignature(String data, String publicKey, String signature)
{
var bytes = Convert.FromBase64String(publicKey);
var rsa = RSA.Create();
rsa.ImportSubjectPublicKeyInfo(bytes, out _);
var rsaParams = rsa.ExportParameters(false);
return rsa.VerifyHash(Encoding.UTF8.GetBytes(data), Convert.FromBase64String(signature), HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
}
这让我大吃一惊)我希望有人能回答) 谢谢
问题出在调用 VerifyHash()
验证签名的 validateSignature 方法中。第一个参数的名称是 rgbHash
并且 documentation 表示:
Parameters rgbHash Byte[] The hash value of the signed data.
此方法用于验证已计算哈希的签名,但您正尝试通过提供数据本身来验证签名,因此将 VerifyHash() 调用更改为 VerifyData() 应该可以解决问题:
public static bool validateSignature(String data, String publicKey, String signature)
{
var bytes = Convert.FromBase64String(publicKey);
var rsa = RSA.Create();
rsa.ImportSubjectPublicKeyInfo(bytes, out _);
// Not used in the provided code.
// var rsaParams = rsa.ExportParameters(false);
return rsa.VerifyData(Encoding.UTF8.GetBytes(data), Convert.FromBase64String(signature), HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
}