Java 如何验证明文的哈希而不是明文本身

Java 如何验证明文的哈希而不是明文本身,java,digital-signature,sha1,Java,Digital Signature,Sha1,我正在用Java验证带有RSA签名的SHA1。我的代码实际上是这样的: String plainText = "myString"; String signature_b64_encoded = "bOBrJmPGJ6eqDpk7sZMJZ0QujErTVz/boe44ANTLbeHd1Pm56UBH3uUCdH4sDZcDczIW5E6Q0o2dq/4lpjTAOzu3FjaLMAZ1sSTn8Ds8XxQnOnmhapbrd/6sNSr9fC57c7BlgAy7GZbCZGUQC/b/UET

我正在用Java验证带有RSA签名的SHA1。我的代码实际上是这样的:

String plainText = "myString";
String signature_b64_encoded = "bOBrJmPGJ6eqDpk7sZMJZ0QujErTVz/boe44ANTLbeHd1Pm56UBH3uUCdH4sDZcDczIW5E6Q0o2dq/4lpjTAOzu3FjaLMAZ1sSTn8Ds8XxQnOnmhapbrd/6sNSr9fC57c7BlgAy7GZbCZGUQC/b/UETb8cIR0B1Dqk41RDorm+NdwDEVCTl4q9I7D70/Kau/aGpUvJ3ULgzM3/JnxHpaWmG7xAsXH9MyxVSxi/ZpJ0WuyuaAiSmiDN946O/ElIxRqnaEtFuSIDinUYz4yAWtoLdssDO5SqMFb8EskUdfExs1IcGtYRaIbz3ASTFdVQoou7HI4pxVn1Sh4Y4mrxa7Ag==";
Signature instance = Signature.getInstance("SHA1WithRSA");
PublicKey pkey = cert.getPublicKey(); // gets my Public Key
instance.initVerify(pkey);
instance.update(plainText.getBytes());
Boolean blnResult = instance.verify(Base64.decode(strSignature.getBytes("UTF-8"), Base64.DEFAULT));
问题是,经过验证的签名只有在某些情况下是假的,而在其他情况下是真的。我无法理解这个结果随机性的原因

  • 我试图验证的字符串已在.NET环境中签名
  • 在.NET中完成的签名验证是在明文的哈希上进行的,而不是在明文上进行的
问题1

是否有一种方法可以在Java中验证明文的散列而不是明文本身(在.NET中是可能的)?这将确保在验证过程开始时有相同的输入

问题2


是否有其他方法可以在Java中验证带有RSA签名的SHA1?

不同结果的情况之间有什么区别?我的代码中的差异只是由于orderData值内容不同,但orderData是base64编码的。90%的时候,我的代码都能正常工作。