2011-04-07 4 views
6

jar 파일이 명백하게 변조되지 않았는지 프로그래밍 방식으로 확인하려고합니다. 내가 막기를 원하는 유스 케이스가 2 개 있습니다. 1) 기존 클래스의 수정 2) 항아리에 새 클래스 추가Jar 서명 확인

jarsigner를 사용하여 jar에 서명했습니다. jarsigner를 사용하여 위의 경우 중 하나를 확인하면 예상대로 작동합니다.

내가 그러나 How to verify a jar signed with jarsigner programmatically 또는 How to verify signature on self signed jar? 에서 프로그래밍 샘플을 사용하여 수행하려고

, 나는 그 문제에 관해서는 전혀는 SecurityException ... 또는 예외를하지 않습니다.

다른 사람들을 위해 작동하는 것처럼 보이기 때문에 내가 뭘 잘못하고 있는지 확실하지 않습니다. 어떤 아이디어? 이것은 JDK 1.6 BTW입니다.

편집 : 은, 아래의 코드의 샘플을 요청으로 ... 아래의 예를 사용하여 자신의 수정 항아리 :

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

+0

테스트중인 JAR을 어떻게 변경 했습니까? – trashgod

+0

7zip으로 열었습니다. 새로운 패키지 디렉토리에 클래스 파일을 추가하고 재 컴파일 된 버전으로 기존 클래스 파일을 수정했습니다. – Amasuriel

+0

'jarsigner'가 변경된 JAR를 거부하지만 코드가이를 받아들이면 [sscce] (http://sscce.org/)가 문제를 발견하는 데 도움이 될 수 있습니다. – trashgod

답변

1

나는 이것이 왜 나에게 일어나고 있는지를 알았다. 그것은 어리석은 실수였다.

나는 내 변조 된 항아리를 가지고 있었지만 이것 또한 내 dev env 였기 때문에 컴파일 된 모든 동일한 클래스를 가졌다. 따라서 클래스 로더는 jar 클래스를 통해 컴파일 된 클래스를 선택했습니다. 컴파일 된 클래스에는 매니페스트가 없으므로 보안 오류가 생성되지 않습니다.

일단 컴파일 된 클래스를 삭제하면 예상되는 보안 예외가 발생합니다.

7

를 제공, 나는 제대로 서명 JAR에 대한 (true를) 예상 된 결과를 얻을 수 및 변경된 JAR (false). 테스트를 위해 효과를 트리거하는 간단한 방법 중 하나는 META-INF/MANIFEST.MF에 나열된 다이제스트 중 하나를 변경하는 것입니다.

이 방법은 이 아니라 매니페스트에 나열된 인 항목을 무시합니다. jarsigner -verify을 사용하여 "이 jar에는 무결성 검사를받지 않은 서명되지 않은 항목이 들어 있습니다." 스트림을 완전히 읽은 후에는 엔트리에 서명자가 있는지 확인하기 위해 entry.getCodeSigners()을 사용할 수 있습니다.

import java.io.IOException; 
import java.io.InputStream; 
import java.util.Enumeration; 
import java.util.jar.JarEntry; 
import java.util.jar.JarFile; 

/** @see http://stackoverflow.com/questions/5587656 */ 
public class Verify { 

    public static void main(String[] args) throws IOException { 
     System.out.println(verify(new JarFile(args[0]))); 
    } 

    private static boolean verify(JarFile jar) throws IOException { 
     Enumeration<JarEntry> entries = jar.entries(); 
     while (entries.hasMoreElements()) { 
      JarEntry entry = entries.nextElement(); 
      try { 
       byte[] buffer = new byte[8192]; 
       InputStream is = jar.getInputStream(entry); 
       while ((is.read(buffer, 0, buffer.length)) != -1) { 
        // We just read. This will throw a SecurityException 
        // if a signature/digest check fails. 
       } 
      } catch (SecurityException se) { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

주 : JDK 8의 경우, 단순히 입력 스트림을 얻을 수는 충분하지 않습니다. jarsigner에서와 같이 스트림도 읽어야합니다. 위의 코드에서 입력 스트림을 가져온 후 jar signersource에서 변형 된 루프가 추가되었습니다.

+0

흠. 귀하의 샘플은 광산과 거의 동일하지만 귀하는 보안 예외를받으며 그렇게하지 않습니다. 정확히 JDK를 사용하고 있습니까? – Amasuriel

+0

버전은 부적합합니다. 'SecurityException'은 엔트리가 잘못 서명 된 경우에만 발생합니다. 'META-INF/ .SF'를 사용하여 조작 할 수도 있습니다. – trashgod

+0

나는 이것이 대부분의 사람들에게 효과적이기 때문에 대답으로 표시 할 것입니다. 나는 기회가 생겼을 때 더 간단한 예제로 시도 할 것입니다 ... 왜 그것이 내 문제는 해결할 수 없지만 문제는 해결할 수 없다는 것을 알아 내면 나는 새로운 질문을 열 것입니다. – Amasuriel

관련 문제