我發現了兩個類似的問題,並試圖運行代碼給出的解決方案,因爲那些說的答案沒有爲我工作,所以提出的代碼片段的問題。signature.verify()總是返回False?
無論是說,答案是沒有工作,所以請不要把這個問題視爲重複
這裏是我的代碼。
import com.sun.org.apache.xml.internal.security.utils.Base64;
import java.io.FileInputStream;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import xmlread.ReadXMLFile;
public class CertificateTest {
public static void main(String[] sdd) {
try{
FileInputStream fin = new FileInputStream("pub.arm");
CertificateFactory f = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) f.generateCertificate(fin);
PublicKey pk = certificate.getPublicKey();
byte[] sign = "Qn/rlJRdZAdlPpu1UmmjE+rup8rv8d6XlS9MngAorzYDXefw0vWEP4eHil3YHoA1JUkoQQOgmw0w0QZFmrQbS33sa2t76iuqXI7EtnAPU798K+hEXP88tsYDWJNJFo9DdhkGltP5dQ02DN030Q1w58aTF+yZFfY1KVOPx2bIoL8=".getBytes();
Signature sig = Signature.getInstance("SHA1withRSA");
sig.initVerify(pk);
sig.update(Base64.decode(ReadXMLFile.getString().getBytes()));
boolean verifies = sig.verify(Base64.decode(ReadXMLFile.getString().getBytes()));
System.out.println("signature verifies: " + verifies);
}catch(Exception ex){}
}
}
那是因爲你的代碼是錯誤的,你要比較base64-的RSA加密的SHA1摘要解碼'ReadXMLFile.getString()'自己。你的意思是做'sig.verify(Base64.decode(sign))'嗎? – oldrinb
其實根據算法,服務器在發送到服務器之前正在對BASE64進行編碼登錄。這就是我在驗證之前解碼它的原因。 –
是的,但問題是您沒有將數據的簽名與'sign'中的數據進行比較。 – oldrinb