मैं प्रोग्रामेटिक रूप से सत्यापित करने की कोशिश कर रहा हूं कि एक जार फ़ाइल स्पष्ट रूप से छेड़छाड़ नहीं की गई है। मेरे पास 2 उपयोग के मामले हैं जिन्हें मैं रोकना चाहता हूं। 1) मौजूदा कक्षाओं के संशोधनों 2) जारजार हस्ताक्षर सत्यापित करना
में नए वर्गों के जोड़ों ने मैंने jarsigner का उपयोग कर जार पर हस्ताक्षर किए। जब मैं उपरोक्त मामलों में से किसी एक को jarsigner के साथ सत्यापित करता हूं तो यह काम करता है जैसे मैं उम्मीद करता हूं।
जब मैं How to verify a jar signed with jarsigner programmatically या How to verify signature on self signed jar? तथापि में प्रोग्राम के रूप में नमूने का उपयोग करने की कोशिश, मैं उस बात के लिए कोई भी SecurityExceptions ... या किसी भी अपवाद नहीं मिलता है।
यकीन नहीं है कि मैं क्या कर रहा हूं क्योंकि उन स्निपेट अन्य लोगों के लिए काम करना प्रतीत होता है। कोई विचार? यह जेडीके 1.6 बीटीडब्ल्यू है।
संपादित करें: के रूप में नीचे का अनुरोध किया, कोड का एक नमूना ... अपने स्वयं के संशोधित जार :)
JarFile myJar;
try
{
//Insert the full path to the jar here
String libPath = ""
stature = new JarFile(libPath,true);
//Don't really need this right now but was using it to inspect the SHA1 hashes
InputStream is = myJar.getInputStream(myJar.getEntry("META-INF/MANIFEST.MF"));
Manifest man = myJar.getManifest();
is.close();
verifyJar(myJar);
}
catch (IOException ioe)
{
throw new Exception("Cannot load jar file", ioe);
}
private void verifyJar(JarFile jar) throws Exception
{
Enumeration<java.util.jar.JarEntry> entries = jar.entries();
while (entries.hasMoreElements())
{
java.util.jar.JarEntry entry = entries.nextElement();
try
{
jar.getInputStream(entry);
//Also tried actually creating a variable from the stream in case it was discarding it before verification
//InputStream is = jar.getInputStream(entry);
//is.close();
}
catch (SecurityException se)
{
/* Incorrect signature */
throw new Exception("Signature verification failed", se);
}
catch (IOException ioe)
{
throw new Exception("Cannot load jar file entry", ioe);
}
}
}
आपने परीक्षण के तहत जेएआर के साथ कैसे छेड़छाड़ की? – trashgod
मैंने इसे 7zip में खोला। मैंने इसमें कुछ क्लास फाइलों के साथ एक नई पैकेज निर्देशिका जोड़ा और पुन: संकलित संस्करणों के साथ मौजूदा क्लास फाइलों में से कुछ को संशोधित किया। – Amasuriel
यदि 'jarsigner' बदलते JAR को अस्वीकार करता है, लेकिन आपका कोड इसे स्वीकार करता है, तो एक [sscce] (http://sscce.org/) समस्या को हल करने में मदद कर सकता है। – trashgod