자바 암호 프로그래밍 Java Cryptography Programming

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

KUMHO SOFTWARE DEVELOPMENT 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램 2.4 자바 응용 프로그램 2.5 자바 애플릿 프로그램 2. 자바 환경과 자바 프로그램.
Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
목 차 C# 언어 특징 .NET 프레임워크 C# 콘솔 프로그램 C# 윈도우 프로그램 실습 프로그래밍세미나 2.
OpenCV 안드로이드 연동 환경설정 OpenCV-Android 를 다운 받습니다.
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
Image & Video processing
자바 암호화 프로그래밍 전자상거래보안.
자바 암호 프로그래밍 Java Cryptography Programming
Power Java 제3장 이클립스 사용하기.
4강. Servlet 맛보기 Servlet 문서 작성 하기 web.xml에 서블릿 맵핑 어노테이션을 이용한 서블릿 맵핑
컴퓨터 프로그래밍 기초 [Final] 기말고사
자바 암호 프로그래밍 Java Cryptography Programming
자바 암호 프로그래밍 Java Cryptography Programming
Power Java 제2장 자바 개발 도구.
Chapter 3. Architecture AI & HCI Lab 김 주 영.
나민영 서경대학교 컴퓨터공학과 CGVR Lab 같이만들어보자 5주차 OpenCV 설정 및 기초.
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
10장 함수.
교과목 소개 정보보호.
암호학 응용 Applied cryptography
Lesson 6. 형변환.
Java 기초 (Java JDK 설치 및 환경설정)
제 1장 소 개 컴퓨터네트워크실험실 우 준.
File Depender 중간 발표.
공개키 암호화 프로그래밍 전자상거래보안.
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
Visual Basic .NET 처음 사용하기.
1. C++ 시작하기.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
                              데이터베이스 프로그래밍 (소프트웨어 개발 트랙)                               퍼스널 오라클 9i 인스톨.
소프트웨어 분석과 설계 Struts2 & JBOSS 설치하기
22강. 파일 업로드 - 파일 업로드 라이브러리 설치 - 파일 업로드 프로그래밍 Lecturer Kim Myoung-Ho
WinCE Device Driver 실습 #3
WinCE Device Driver 실습 #2
10장. 예외처리.
2장 JSP 개발 환경 설정 이장에서 배울 내용 : JSP 페이지를 작성하기 위한 개발환경을 설정하고, 웹 어플리케이션 개발을 위해 반드시 이해하여야 할 웹 어플리케이션 폴더 구조에 대해 학습한다. 또한 요청된 JSP 페이지가 어떠한 처리과정을 거쳐 응답이 이루어지는가에.
CHAP 12. 리소스와 보안.
Wireless Java Programming
[INA470] Java Programming Youn-Hee Han
7장 인터페이스와 추상 클래스.
Java 9장. 인터페이스와 예외처리 public class SumTest {
Method & library.
웹어플리케이션보안 암호프로그래밍, crypto-js
전자정부 표준프레임워크 호환성 가이드 전자정부 표준프레임워크 사업단 실행환경 개발팀.
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
15장 컬렉션 프레임워크 Section 1 컬렉션 프레임워크의 개요 Section 2 리스트 Section 3 셋
16 장 네트워크 보안 : 방화벽과 VPN 16.1 개요 16.2 기밀성 16.3 전자 서명 16.4 인터넷 보안
자바 5.0 프로그래밍.
JA A V W. 06.
CHAP 21. 전화, SMS, 주소록.
학습목표 처음 만드는 비주얼 베이직 프로그램 프로그램 실행과 실행 파일 생성. 학습목표 처음 만드는 비주얼 베이직 프로그램 프로그램 실행과 실행 파일 생성.
STS 에서 웹 서버 설치 방법.
OpenCV 설정 2.21 만든이 딩딩.
암호학 응용 Applied cryptography
암호학 응용 Applied cryptography
05. General Linear List – Homework
3장 JSP프로그래밍의 개요 이장에서 배울 내용 : JSP페이지의 기본적인 개요설명과 JSP페이지의 처리과정 그리고 웹 어플리케이션의 구조에 대해서 학습한다.
기초C언어 제2주 실습 프로그래밍의 개념, 프로그램 작성 과정 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원
발표자 : 이지연 Programming Systems Lab.
(c) Byoungcheon Lee, Joongbu Univ.
2.가상머신의 탐험 도구, Oolong에 대하여 ps lab 김윤경.
JSP Programming with a Workbook
자바 암호 프로그래밍 Java Cryptography Programming
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
CHAP 15. 데이터 스토리지.
JAVA 프로그래밍 16장 JNLP.
자바 암호 프로그래밍 Java Cryptography Programming
Presentation transcript:

자바 암호 프로그래밍 Java Cryptography Programming 2017. 3. 중부대학교 정보보호학과 이병천 교수

차례 1. 강의 개요 2. 암호와 정보보호 3. 자바프로그래밍 기초 4. 자바 네트워크 프로그래밍 5. JCA/JCE 암호 프로그래밍 6. 해쉬함수, MAC, 패스워드 기반 키생성 7. 대칭키 암호, 파일 암호화/복호화 8. 공개키 암호 9. 전자서명 10. 인증서와 공개키기반구조(PKI) 11. 암호 알고리즘/프로토콜 구현

5. JCA/JCE 프로그래밍

1. JCA/JCE 소개 자바에서의 암호 구현 패키지 JCA(Java Cryptography Architecture) Import java.security.* 미국의 수출규제를 통과할 수 있는 내용으로 구현 암호화 처리를 위한 표준 구조, 인터페이스, 팩토리 등을 정의 JCE(Java Cryptography Extension) Import javax.crypto.* JCA에서 부족한 내용을 보충하여 별도로 구현 암/복호화, 키 생성, 키 교환, MAC 등 실질적인 암호화 처리 기능을 제공 JCA와 JCE는 프로그래머들이 응용을 개발할 때 사용할 수 있는 암호프로그래밍의 추상 계층(abstraction layer)을 제공

JCA의 설계 원칙 구현 독립성 (Implementation Independence) 프로그래머는 알고리즘을 구현한 제공자가 누구인지 알 필요가 없이 동일한 API를 이용하여 암호화 서비스 이용 가능 구현 호환성 (Implementation Interoperability) 프로그래머가 서로 다른 프로바이더(provider)에 의해 제공되는 구현을 사용하더라도 상호 동작해야 함 알고리즘 확장성 (Algorithm Extensibility) 제공되지 않는 알고리즘은 쉽게 추가하여 동일한 API로 사용할 수 있어야 함

JCA와 프로바이더 JCA는 프로바이더 기반 체계 모든 프로바이더는 java.security.Provider 클래스의 구현체로, CSP (Cryptographic Service Provider)라고 부름 사용자가 특정 알고리즘의 인스턴스를 요청하면 JCA는 프로바이 더 저장소에서 해당 알고리즘에 적합한 구현체를 찾아 인스턴스 를 생성 동일한 알고리즘이 여러 프로바이더에 정의되어 있으면 저장소 의 선호 순서를 따름 명시적으로 특정 프로바이더에 인스턴스를 요청할 수도 있음

JCA와 프로바이더 MessageDigest md = MessageDigest.getInstance("MD5"); JCA는 등록된 CSP를 순차적으로 검색하여 MD5 알고리즘이 있는 프로바이더를 찾은 다음, 해당 프로바이더를 사용해서 메시지 다이제스트 인스턴스를 생성

JCA와 프로바이더 MessageDigest md = MessageDigest.getInstance("MD5", "ProviderC"); 특정 프로바이더를 명시

프로바이더 목록 Java.security 파일에 프로바이더 목록 존재 # # List of providers and their preference orders (see above): security.provider.1=sun.security.provider.Sun security.provider.2=sun.security.rsa.SunRsaSign security.provider.3=sun.security.ec.SunEC security.provider.4=com.sun.net.ssl.internal.ssl.Provider security.provider.5=com.sun.crypto.provider.SunJCE security.provider.6=sun.security.jgss.SunProvider security.provider.7=com.sun.security.sasl.Provider security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI security.provider.9=sun.security.smartcardio.SunPCSC security.provider.10=sun.security.mscapi.SunMSCAPI

프로바이더 추가하기 자바 실행환경에 추가하는 방법 어플리케이션 실행시 추가하는 방법 Java.security 파일에 프로바이더 추가 모든 어플리케이션 개발에 기본 사용 가능 어플리케이션 실행시 추가하는 방법 소스코드에서 프로바이더를 추가 추가한 프로바이더는 해당 어플리케이션에서만 사용 가능 외부 JAR 파일을 사용하도록 설정하는 방법

Bouncy Castle 프로바이더 등록하기 http://www.bouncycastle.org/example.html bcprov-jdk15on-156.jar 파일 다운로드하여 자바 실행 환경의 확 장 라이브러리 디렉터리에 복사 <JAVA_HOME>/jre/lib/ext <JRE_HOME>/lib/ext java.security 파일에 Bouncy Castle 프로바이더 등록 security.provider.N=org.bouncycastle.jce.provider.BouncyCastleP rovider 권한 문제로 Java.security 파일을 수정하기가 쉽지 않음

Bouncy Castle 프로바이더 사용하기 http://www.bouncycastle.org/example.html bcprov-jdk15on-156.jar 파일 다운로드하여 현재의 프로젝트 폴 더 등 편리한 곳에 저장 현재 프로젝트에서 위의 jar 파일을 사용하도록 설정 이클립스에서 외부 JAR 파일 추가하기 프로젝트폴더->오른쪽마우스->속성(Properties)->Java Build Path->Libraries->Add External JARs->다운로드 받은 jar파일 선 택->OK

알고리즘의 독립성 같은 종류의 여러 알고리즘을 동일한 메소드를 이용하여 암 호연산을 수행할 수 있음. 다음과 같은 객체들이 사용됨. MessageDigest: 해쉬함수 Signature: 전자서명 KeyPairGenerator: 전자서명을 위한 키 쌍 생성 KeyFactory: 규격에 맞도록 암호키를 변환하는데 사용 KeyStore: 다양한 암호키 관리 SecureRandom: 의사난수 비트 생성 AlgorithmParameters: 암호 알고리즘 파라메터를 관리 AlgorithmParameterGenerator: 암호 알고리즘에 사용될 파라메터 를 생성 CertificateFactory: 인증서와 인증서폐지목록을 생성 CertPathBuilder: 인증경로 생성 CertStore: 인증서 저장

알고리즘의 독립성 같은 인터페이스에 알고리즘 이름만 바꾸어 사용할 수 있도록 구현 try{ 같은 인터페이스에 알고리즘 이름만 바꾸어 사용할 수 있도록 구현 try{ MessageDigest md5 = MessageDigest.getInstance(“MD5”); // MessageDigest md5 = MessageDigest.getInstance(“SHA-1”); md5.update(buffer); byte[] digest = md5.digest(); for(int i=0; i<digest.length; i++) System.out.printf(“%02X ”, digest[i]); } catch(NoSuchAlgorithmException e){ e.printStackTrace();

JCE JCE는 JCA를 확장한 것으로, 다음과 같은 엔진을 추가 로 제공한다. Cipher: 암호화/복호화 KeyGenerator: Cipher를 위한 비밀키 생성 SecretKeyFactory: Cipher를 위한 키변환 KeyAgreement: 키 동의 프로토콜을 위한 클래스 Mac: 메시지 인증 코드 JCE의 엔진은 javax.crypto 패키지에 포함되어 있다. JDK 1.4부터 JCA/JCE 모두 기본적으로 포함되어 있다.

2. 의사난수(pseudo random number) 생성 난수생성의 중요성 암호에서 사용하는 키는 일반적으로 난수를 이용하여 생성해야 안전함. 사람이 선택하는 패스워드는 암호키로 사용하지 않음 암호에서 난수는 매우 중요한 요소. 공격자들이 암호에서 사용되 는 난수의 취약성을 공격할 수 있음. 의사난수 생성 PRNG (Pseudo Random Number Generation) 완전한 난수를 생성하는 것은 아니며 계산하는 알고리즘은 정해 져 있으므로 의사난수라고 부름

의사난수 생성 자바에서의 난수 생성 보통 java.lang.Math에 정의된 random() 메소드나 java.util.Random 클래스를 사용하는데 이들은 암호학적으로 안 전하지 못함 JCA에서는 java.security.SecureRandom 엔진을 사용. 이 엔진 은 java.util.Random 클래스를 상속받고 있어, nextInt()와 같은 매우 편리한 메소드들을 제공함 의사난수 비트 생성은 보통 실제 랜덤한 seed를 사용. 이를 위해 사용자가 직접 setSeed 메소드를 사용할 수 있지만 일반적으로 는 엔진이 안전한 seed를 자동으로 선택하도록 하는 것이 바람 직함

의사난수 생성 사례 try{ SecureRandom csprng = SecureRandom.getInstance("SHA1PRNG"); boolean randBool = csprng.nextBoolean(); int randInt = csprng.nextInt(); byte[] randBytes = new byte[3]; csprng.nextBytes(randomBytes); } catch(NoSuchAlgorithmException e){ e.printStackTrace();

의사난수 생성 import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; public class SecureRandomGen { public static void main(String[] args) { try{ SecureRandom csprng = SecureRandom.getInstance("SHA1PRNG"); System.out.println("사용된 알고리즘: "+csprng.getAlgorithm()); boolean randBool = csprng.nextBoolean(); System.out.println("T/F 난수 출력: "+randBool); int randInt = csprng.nextInt(); System.out.println("정수 난수 출력: "+randInt); byte[] randBytes = new byte[8]; csprng.nextBytes(randBytes); System.out.print("바이트 난수 출력: "); for(byte b: randBytes) System.out.printf("%02X ", b); } catch(NoSuchAlgorithmException e){ e.printStackTrace(); 출력 사례 사용된 알고리즘: SHA1PRNG T/F 난수 출력: true 정수 난수 출력: 667469724 바이트 난수 출력: 30 FE D9 28 1C 55 82 BA