Java signature.verify()总是返回False吗?

Java signature.verify()总是返回False吗?,java,rsa,signature,Java,Rsa,Signature,我发现了两个类似的问题,并尝试运行给出的代码作为解决方案,因为这些答案对我来说不可行,所以用代码片段提出了这个问题 两人都说答案不起作用,所以请不要把这个问题当作重复问题 这是我的密码 import com.sun.org.apache.xml.internal.security.utils.Base64; import java.io.FileInputStream; import java.security.PublicKey; import java.security.Signatur

我发现了两个类似的问题,并尝试运行给出的代码作为解决方案,因为这些答案对我来说不可行,所以用代码片段提出了这个问题

  • 两人都说答案不起作用,所以请不要把这个问题当作重复问题

    这是我的密码

    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){}
        }
    }
    

    下面是我知道
    ReadXMLFile.getString
    不是被测试完整性的数据,而是被编码的签名本身之前的解释。请看决议


    您的代码是错误的——您试图将base64解码的
    ReadXMLFile.getString()
    的RSA加密SHA1摘要与自身进行比较

    final byte[] data = Base64.decode(ReadXMLFile.getString().getBytes());
    sig.update(data);
    boolean verifies = sig.verify(data);
    
    从:

    使用指定的字节数组更新要签名或验证的数据

    然后,从:

    验证传入的签名

    现在,您实际上并没有将签名数据传递到
    verify
    !你是不是打算改为做
    sig.verify(Base64.decode(sign))


    如果您需要进一步的证明,请发布
    pub.arm
    ,我可以演示如何工作,正确的代码:-)

    在我知道
    ReadXMLFile.getString
    不是被测试完整性的数据,而是被编码的签名本身之前,下面是解释。请看决议


    您的代码是错误的——您试图将base64解码的
    ReadXMLFile.getString()
    的RSA加密SHA1摘要与自身进行比较

    final byte[] data = Base64.decode(ReadXMLFile.getString().getBytes());
    sig.update(data);
    boolean verifies = sig.verify(data);
    
    从:

    使用指定的字节数组更新要签名或验证的数据

    然后,从:

    验证传入的签名

    现在,您实际上并没有将签名数据传递到
    verify
    !你是不是打算改为做
    sig.verify(Base64.decode(sign))


    如果您需要进一步的证明,请发布
    pub.arm
    ,我可以演示如何工作,正确的代码:-)

    这是因为您的代码是错误的,您试图将base64解码的
    ReadXMLFile.getString()
    的RSA加密SHA1摘要与自身进行比较。您是否打算执行签名验证(Base64.decode(sign))?实际上,根据algo,服务器在发送到服务器之前正在对Base64中的签名进行编码。这就是我在验证之前对其进行解码的原因。是的,但问题是您没有将数据的签名与
    sign
    中的数据进行比较。这是因为您的代码是错误的,并且您试图将base64解码的
    ReadXMLFile.getString()
    的RSA加密SHA1摘要与自身进行比较。您是否打算执行签名验证(Base64.decode(sign))?实际上,根据algo,服务器在发送到服务器之前正在对Base64中的签名进行编码。这就是我在验证之前对其进行解码的原因。是的,但问题是您没有将数据的签名与
    sign
    中的数据进行比较。感谢Veer的支持。如果我在1小时内发布arm文件,可以吗?因为我需要通过EoDAshish来实现这一点,只需尝试
    boolean verifys=sig.verify(Base64.decode(sign))取代您现在拥有的内容。如果签名
    是正确的签名,则它应该工作。byte byteSignedData[]=signData(Base64.decodeToBytes(strsenbyteEncryptedWithPublicKey)、PrivateKEY);字符串strSignedData=Base64.encodeToString(byteSignedData);这是他们在签名过程中遵循的算法。您的意思是,复制时是否遗漏了任何字符?如果是,这就是最初尝试粘贴字符串的原因,然后开始直接从提供的XMLlet读取字符串。我们感谢Veer的支持。如果我在1小时内发布arm文件,可以吗?因为我需要通过EoDAshish来实现这一点,只需尝试
    boolean verifys=sig.verify(Base64.decode(sign))取代您现在拥有的内容。如果签名
    是正确的签名,则它应该工作。byte byteSignedData[]=signData(Base64.decodeToBytes(strsenbyteEncryptedWithPublicKey)、PrivateKEY);字符串strSignedData=Base64.encodeToString(byteSignedData);这是他们在签名时遵循的算法。您的意思是,复制时是否遗漏了任何字符?如果是,这就是最初尝试粘贴字符串的原因,然后开始直接从提供的XMLlet读取字符串