자바 암호 프로그래밍 Java Cryptography Programming 2017. 3. 중부대학교 정보보호학과 이병천 교수
차례 1. 강의 개요 2. 암호와 정보보호 3. 자바프로그래밍 기초 4. 자바 네트워크 프로그래밍 5. JCA/JCE 암호 프로그래밍 6. 해쉬함수, MAC, 패스워드 기반 키생성 7. 대칭키 암호, 파일 암호화/복호화 8. 공개키 암호 9. 전자서명 10. 인증서와 공개키기반구조(PKI) 11. 암호 알고리즘/프로토콜 구현
9. 전자서명
1. 전자서명이란? 서명의 변천 전자서명이란? 암호기술을 이용하여 전자문서에 대한 서명기능을 구현한 것
전자서명이란? 전자서명
전자서명법 전자서명의 효력을 법적으로 인정
전자서명의 요구조건 위조불가 개인키를 소유한 서명자만이 서명문 생성 가능 변경불가 서명된 문서의 내용 변경 불가 서명자인증 개인키를 소유한 자가 전자서명의 행위자임 재사용불가 A문서의 전자서명을 B문서의 전자서명으로 사용 불가 부인방지 서명자는 전자서명 후에 행위에 대한 부인 불가
전자서명의 활용 사용자 인증 메시지 인증 로그인 등에서 사용자 확인을 위해 사용 로그인 메시지를 사용자의 개인키로 서명하여 전송, 서버에서 사 용자의 공개키로 검증 인터넷뱅킹, 전자정부서비스 로그인 메시지 인증 메시지에 전자서명을 부가하여 사용자의 서명 사실을 증명 수신자는 사용자의 공개키로 서명을 검증 부인방지 기능 제공
전자서명 수기서명과 전자서명의 비교
전자서명 알고리즘 RSA ElGamal DSA Nyberg-Rueppel KCDSA ECDSA GQ Schnorr NIST에서 1991년 미국전자서명 표준으로 제안 Nyberg-Rueppel KCDSA 한국의 전자서명 표준 ECDSA 타원곡선기반 DSA 전자서명 GQ Schnorr
RSA 전자서명 RSA 전자서명은 RSA 공개키 암호화의 반대 연산 전자서명은 해쉬함수와 함께 사용 서명자의 신분 인증? 서명생성(sign) : 개인키 이용 서명검증(verify) : 공개키 이용 전자서명은 해쉬함수와 함께 사용 전자서명은 공개키암호 연산을 사용하므로 속도가 느림. 메시지 전체에 대해 서명연산을 하지 않고 메시지의 해쉬값에 대 해 서명연산을 1회만 수행 계산량과 통신량을 크게 줄일 수 있음 서명자의 신분 인증? 인증기관이 발행한 인증서를 이용하여 서명자의 신분 인증
RSA 전자서명 테스트 https://kjur.github.io/jsrsasign/sample-rsasign.html
DSA (Digital Signature Algorithm) 1991년 NIST에서는 DSS에서 사용할 DSA을 제안. DSS는 전자서명의 표준 이름이고 이 표준안에서 사용되 는 알고리즘이 DSA임. (미국 연방 표준 서명 알고리즘) 이산대수문제의 어려움을 안정성의 바탕으로 삼음 Y=g^x mod p 에서 Y, g, p을 공개하더라도 x를 계산하기 어렵다 는 가정
ECDSA 타원곡선 전자서명 알고리즘(Elliptic Curve Digital Signature Algorithm)
2. JCA/JCE에서의 전자서명 java.security.Signature 클래스를 사용 공개키/개인키 생성 방식은 공개키암호와 동일 getInstance( ) 메소드를 호출해서 서명 객체 생성 전자서명 알고리즘은 “<해시 함수>with<서명 알고리즘>” 형태 로 사용 Signature signature = Signature.getInstance(“SHA1withRSA”);
Signature 클래스 Signature 클래스를 이용한 전자서명
Signature 클래스
전자서명을 위한 키생성 DSA (Digital Signature Algorithm) RSA (Rivest Shamir Adleman) EC (Elliptic Curve, 타원곡선 암호)
전자서명 알고리즘 선택 키생성 알고리즘 전자서명 알고리즘 RSA DSA EC
예제: SignatureExample.java // 전자서명 생성 public static byte[] sign(PrivateKey privateKey, byte[] plainData) throws GeneralSecurityException { Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(plainData); byte[] signatureData = signature.sign(); return signatureData; } // 전자서명 검증 public static boolean verify(PublicKey publicKey, byte[] signatureData, byte[] plainData) throws GeneralSecurityException { signature.initVerify(publicKey); return signature.verify(signatureData);
RSA 전자서명 예제: SignatureExample.java 키생성 서명 KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); generator.initialize(2048); KeyPair pair = generator.generateKeyPair(); Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(plainData); byte[] signatureData = signature.sign();
DSA 전자서명 예제: SignatureExampleDSA.java 키생성 서명 KeyPairGenerator generator = KeyPairGenerator.getInstance(“DSA"); generator.initialize(2048); KeyPair pair = generator.generateKeyPair(); Signature signature = Signature.getInstance("SHA256withDSA"); signature.initSign(privateKey); signature.update(plainData); byte[] signatureData = signature.sign();
ECDSA 전자서명 (타원곡선기반 전자서명) 예제: SignatureExampleECDSA.java 키생성 서명 KeyPairGenerator generator = KeyPairGenerator.getInstance(“EC"); generator.initialize(256); KeyPair pair = generator.generateKeyPair(); Key size must be at most 571 bits 타원곡선암호는 키길이가 작아도 됨 Signature signature = Signature.getInstance(" SHA256withECDSA"); signature.initSign(privateKey); signature.update(plainData); byte[] signatureData = signature.sign();
난수화된 RSA 전자서명 RSA 전자서명은 같은 메시지에 대해 항상 동일한 서명 값을 출력. RSA/PSS 공격자가 동일한 메시지에 대한 서명임을 인지 가능 RSA/PSS Probabilistic Signature Scheme Salt를 이용한 메시지 패딩 이용
RSA/PSS Bouncy Castle에 RSA/PSS 제공 예제: SignatureExampleRSAPSS.java 서명, 검증 알고리즘에 “SHA256withRSA/PSS” 또는 “SHA256withRSAandMGF1” 지정 메인 클래스에서 BC 프로바이더 추가 같은 키를 사용하더라도 매번 다른 서명값을 출력 Security.addProvider(new BouncyCastleProvider());
전자봉투 (Digital Envelope) 3가지 기능을 한번에 전자서명 : 송신자의 개인키로 전자서명 메시지 암호화 : 난수 세션키로 메시지와 서명값을 암호화 세션키 전달 : 세션키를 수신자의 공개키로 암호화 송신자 수신자
전자봉투 생성 Bob’s Public Key/Private Key Alice’s Public Key Randomly Generated Session Key Encryption Hash Algorithm Hash Signature Signing Encrypted Message SEND Symmetric Key Cryptosystem
전자봉투 확인 Bob’s Public Key Alice’s Public Key/Private Key Signature Decryption Alice’s Public Key/Private Key Signature Hash Algorithm Hash1 Hash2 Verifying Encrypted Session Key Message RECEIVE
예제: Envelope.java 실행 결과