Akashic Records

자바을 이용한 암호학 - 10 본문

오래된글/Java

자바을 이용한 암호학 - 10

Andrew's Akashic Records 2018. 4. 7. 23:30
728x90

Chapter 5 Java 보안과 Applet 보안


PLT 5.1 Jarsigner

jarsigner는 JDK에 포함된 어플리케이션이고 JAR 파일에 서명을 하고 검증하는 역할을 한다. jar파일 서명하기전에 Keytool을 가지고 서명에 필요한 개인키와 인증서를 생성한다.

Public class HelloWorld {

public static void main (String[] args) {

System.out.println("Hello World!");

}

}


JAR 파일 생성

“jar cvf HelloWorld.jar HelloWorld.class”


JAR 파일 서명 (jarsigner [JAR파일] [인증서 Alias])

“jarsigner HelloWorld.jar hurukku”


JAR파일 서명 확인

jarsigner -verbose -verify -certs HelloWorld.jar

140 Tue Jul 19 14:14:34 KST 2005 META-INF/MANIFEST.MF

193 Tue Jul 19 14:14:34 KST 2005 META-INF/HURUKKU.SF

1024 Tue Jul 19 14:14:34 KST 2005 META-INF/HURUKKU.DSA

0 Tue Jul 19 14:13:48 KST 2005 META-INF/

smk 426 Tue Apr 03 15:24:10 KST 2001 HelloWorld.class

X.509, CN=Lee Yun Chang, OU=Team, O=Love, L=Kwang Jin, ST=Seoul, C=KO (hurukku)

s = signature was verified

m = entry is listed in manifest

k = at least one certificate was found in keystore

i = at least one certificate was found in identity scope

jar verified.


서명된 JAR파일 내의 META-INF/manifest.mf 파일과 [Alias].SF 파일을 보면 다음과 같이 각각의 Class에 해쉬가 기록되어 있음을 알 수 있다.

manifest.mf

Manifest-Version: 1.0

Created-By: 1.4.2_08 (Sun Microsystems Inc.)

Name: HelloWorld.class

SHA1-Digest: 2AfBTVdjLYp/YZvZZ91HJ3B8unQ=


hurukku.sf

Signature-Version: 1.0

Created-By: 1.4.2_08 (Sun Microsystems Inc.)

SHA1-Digest-Manifest: LPQWq8z4OHUPmjniuKQ0r1y2cxE=

Name: HelloWorld.class

SHA1-Digest: Rgt4mFrRyIV5U2wLt6lbUQhwZp0=


JAR파일 안의 어떤 파일도 변경되지 않았다는 보증을 해야 하는 경우가 있다. 예를 들어 어플리케이션과 함께 문서를 배급하고 있다고 가정하면, 서명된 JAR 파일 안에 변경되지 않았다는 보증을 할 수 있을 것이다. JAR 파일의 getResourceAsStream()을 호출하면 자원의 서명을 체크할 수 있다.


PLT 5.2 보안관리자

자바보안 관리자는 필요한 때에 권한을 Check한다. 보안관리자는 다음 순서로 동작한다.

1. 권한을 요구하는 코드를 호출한다.

2. 보안 관리자는 권한이 허가되는지 Check한다.

3. 권한이 주어지지 않았으면 java.lang.SecurityException을 발생한다.

4. 권한이 주어졌다면 정상적으로 실행된다.


java.policy파일

위치 : [JAVA_HOME]/jre/lib/security/java.policy

// Standard extensions get all permissions by default

// [java_home]/lib/ext 밑의 모든 코드을 위한 권한

grant codeBase "file:${java.home}/lib/ext/*" {

permission java.security.AllPermission;

};

// default permissions granted to all domains

// 모든 코드을 위한 권한

grant {

// Allows any thread to stop itself using the java.lang.Thread.stop()

// method that takes no argument.

// Note that this permission is granted by default only to remain

// backwards compatible.

// It is strongly recommended that you either remove this permission

// from this policy file or further restrict it to code sources

// that you specify, because Thread.stop() is potentially unsafe.

// See "http://java.sun.com/notes" for more information.

permission java.lang.RuntimePermission "stopThread";

// allows anyone to listen on un-privileged ports

permission java.net.SocketPermission "localhost:1024-", "listen";

// "standard" properies that can be read by anyone

permission java.util.PropertyPermission "java.version", "read";

permission java.util.PropertyPermission "java.vendor", "read";

permission java.util.PropertyPermission "java.vendor.url", "read";

permission java.util.PropertyPermission "java.class.version", "read";

permission java.util.PropertyPermission "os.name", "read";

permission java.util.PropertyPermission "os.version", "read";

permission java.util.PropertyPermission "os.arch", "read";

permission java.util.PropertyPermission "file.separator", "read";

permission java.util.PropertyPermission "path.separator", "read";

permission java.util.PropertyPermission "line.separator", "read";

permission java.util.PropertyPermission "java.specification.version", "read";

permission java.util.PropertyPermission "java.specification.vendor", "read";

permission java.util.PropertyPermission "java.specification.name", "read";

permission java.util.PropertyPermission "java.vm.specification.version", "read";

permission java.util.PropertyPermission "java.vm.specification.vendor", "read";

permission java.util.PropertyPermission "java.vm.specification.name", "read";

permission java.util.PropertyPermission "java.vm.version", "read";

permission java.util.PropertyPermission "java.vm.vendor", "read";

permission java.util.PropertyPermission "java.vm.name", "read";

};


정책파일의 편집은 JDK에 포함된 policytool 어플리케이션을 이용하면 쉽게 조정 할 수 있다.

policytool을 이용한 정책파일 조정은

http://java.sun.com/developer/onlineTraining/Security/Fundamentals/magercises/Policytool/help.html

에서 참고 하길 바란다.


자바에 포함된 권한

1. java.security.Allpermission : 모든 것에 대한 모든 권한

2. java.security.BasicPermission : 가장 간단한 권한

3. java.io.FilePermission : 파일을 읽고 쓰는 권한

4. java.net.SocketPermission : 원격지에 대한 소켓을 열고 DNS로 호스트 이름을 찾을 권한.


java.security.BasicPermission의 상세 권한

  • javax.soundmapled.AudioPermission : 연주하고 녹음하는 등의 오디오에 관한 권한.

  • java.awt.AWTPermission : 클립보드에 접근하거나 AWT 이벤트를 읽어들이는 등의 그래픽에 관련된 것에 대한 권한.

  • java.net.NetPermission : URL을 다루는 권한.

  • java.util.PropertyPermission : 시스템의 속성을 읽고 쓸수 있는 권한.

  • java.lang.reflect.ReflectPermission : 리플렉션을 사용하는 권한.

  • java.lang.RuntimePermission : 클래스로더나 보안 관리자를 세팅하는 등의 실행 요소들에 대한 권한.

  • java.security.SecurityPermission : 보안 정책이나 암호 서비스 제공자 같은 보안 요소들에 대한 권한.

  • java.io.SerializablePermission : 시리얼라이즈가 가능한 객체들을 읽고 쓰는 권한.

  • java.sql.SQLPermission : SQL의 로그를 세팅하는 권한.


728x90

'오래된글 > Java' 카테고리의 다른 글

자바을 이용한 암호학 - 12  (0) 2018.04.07
자바을 이용한 암호학 - 11  (0) 2018.04.07
자바을 이용한 암호학 - 9  (0) 2018.04.07
자바을 이용한 암호학 - 8  (0) 2018.04.07
자바을 이용한 암호학 - 7  (0) 2018.04.07
Comments