암호학 응용 Applied cryptography

Slides:



Advertisements
Similar presentations
1. 브라우저에서 로 관리창으로 접속해서, 서버 인증서를 설치 할 서버를 선택하고 Manage 버튼을 클릭합니다. 2. Security 탭을 선택한 후, 인증서 Trust.
Advertisements

SSL (Secure Socket Layer) 중부대학교 정보보호학과 이병천 교수. 웹 보안 구현방법  네트워크 계층에서의 구현방법  특징  IP 계층에 보안 기능을 둠  IP Sec  응용계층의 모든 응용서비스에 보안성 제공  VPN(Virtual Private.
DB Injection과 대응방안 nwkim.
제 1장 자바스크립트란 ?.
웹 어플리케이션 보안 2016년 2학기 12. Cryptography.
IoT(사물인터넷) 보안 2016년 2학기 4. 라즈베리파이 카메라.
MEAN Stack Front to Back (MEANAuthApp)
OpenSSL 인증서 발급.
HTML과 CGI 프로그래밍 PHP 웹 프로그래밍 (PHP Web Programming) 문양세
암호학 응용 Applied cryptography
IoT(사물인터넷) 보안 2016년 2학기 3. 라즈베리파이와 node.js.
1 HTML5 개요.
채팅 서버 만들기 10장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
(c) Byoungcheon Lee, Joongbu Univ.
웹어플리케이션보안 인증서 활용 중부대학교 정보보호학과 이병천 교수.
모바일 서버 만들기 13장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
Chapter 32 Analyzing Web Traffic
2 서블릿의 기초.
01. Index StarPlayer API Guide 01. Index 02. 상수값 정의 03. API 정의
공개키 기반구조 (Public Key Infrastructure)
Chapter 04. 웹 보안 : 웹, 그 무한한 가능성과 함께 성장한 해킹
Web Server와 DB 연동.
이 름: 정홍도 (과장) 팀 명: 개발사업팀 일 자:
4 쿠키와 세션.
암호학 응용 Applied cryptography
2. PHP 프로그래밍 웹 브라우저로 데이터 전송 주석 작성하기 변수/상수 문자열/숫자형 HTML 폼 만들기
JavaScript.
Web Security 모든 HTTP 패킷은 엽서와 같음 SSL/TLS
AJAX 커머스아이 박준열.
JSON-RPC 서버 만들기 11장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
JQuery Mobile #3-1 Jeon Yong ju.
12 데이터베이스 사용하기.
웹어플리케이션보안 forge – 자바스크립트 암호 라이브러리
Cookie 와 Session.
Html(front end) & jsp(back end)
WebtoB Key 및 CSR생성 방법 1. 비밀키 및 CSR생성 path/ssl 에서 CSR을 생성한다.
HTML5 웹 프로그래밍 입문 (개정판) 9장. 자바스크립트 객체와 DOM.
프로그래밍 원리 Chapter 05 자바스크립트 기초 신한대학교 IT융합공학부 박 호 균.
CHAPTER 14. HTML5 웹스토리지, 파일API, 웹소켓.
HTML.
SYSMAC GATEWAY 간이 매뉴얼.
Chapter11 웹 스토리지 & 웹 데이터베이스
JavaScript COOKIE Chapter 10 Part III
Web Vulnerabilities 정보 보호 2008/05/31 Getroot.
JavaScript 기초 Chapter 8 Part II
HTML CSS 자바스크립트 무작정 따라하기
CGI (Common Gateway Interface)
SNS 로그인 API 연동 조휘제.
인터넷응용프로그래밍 JavaScript(array).
전자상거래보안 전자우편보안 ( Security) 중부대학교 정보보호학과 이병천 교수
KTF 무선인터넷 표준 UI 2000년 4월 SK 텔레콤 귀중 CP 제공용
Chapter13 파일 접근 & 오프라인 접근 HTML5 Programming.
IoT(사물인터넷) 보안 2016년 2학기 3. 라즈베리파이와 node.js.
폼 관련 태그 폼 양식 직접 만들어보기 회원가입 절차 4단계
CGI (Common Gateway Interface)
User Datagram Protocol (UDP)
JavaScript 객체(objects)
Apache Key 및 CSR생성 방법 1. 랜덤 넘버 생성 $ openssl md5 * > rand.dat
Korea University of Technology and Education
LOGIN할 때 아이디, 비번 입력 여부 체크하기
세션 (Session) Yang-Sae Moon Department of Computer Science
웹 어플리케이션 보안 2016년 2학기 11. Enhancing Security.
암호학 응용 Applied cryptography
PGP 8.1 설치 및 활용가이드.
Chapter 3. Public Key Infrastructure
이번 시간에는... 지난 시간까지 2회차에 걸쳐 WML의 택스트 포맷, 이미지 처리, 페이지 이동, 태스크 수행과 이벤트 처리 및 WML 사용자 Input 처리 태그 등, WML 개발에 대해서 알아보았습니다. 이번 시간에는 2회차에 걸쳐, WML 스크립트 개발에 대해서.
웹어플리케이션보안 난수화 토큰인증 중부대학교 정보보호학과 이병천 교수.
Web & Internet [10] 입문 – input 태그
머니투데이 메인 UI수정 Moneytoday.co.kr - 작성자 : 한정환 - 작성일 :
MEAN Stack Front to Back (MEANAuthApp)
Presentation transcript:

암호학 응용 Applied cryptography 2017. 9. 중부대학교 정보보호학과 이병천 교수

차례 1. 강의 개요 2. Javascript Cryptography 3. Node.js crypto 4. Crypto-js 5. Example 1 – Chatting 6. Forge 7. Certificate

7. 인증서 활용 인증기관 운영 - 인증서 발급 - 인증서, 개인키의 파일 저장, 파일에서 읽어오기 - 인증서, 개인키의 로컬스토리지 저장, 활용

파일생성, 메뉴 추가 Forgecert.html <!-- Collect the nav links, forms, and other content for toggling --> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li><a href="index.html">Home <span class="sr-only">(current)</span></a></li> <li><a href="about.html">About</a></li> <li><a href="chat.html">Chatting</a></li> <li><a href="cryptojs.html">Crypto-js</a></li> <li><a href="forge.html">Forge</a></li> <li><a href="forgersa.html">Forge-RSA</a></li> <li class="active"><a href="forgecert.html">Forge-Cert</a></li> </ul> </div><!-- /.navbar-collapse --> 중략 <script src="forgecert.js"></script>

인증서 발급 신청 Forgecert.html - UI <h1>인증서 발급 신청</h1> <div class="form-group"> <label for="certKeySize">RSA KeySize:</label> <select class="form-control" id="certKeySize"> <option value="1">1024</option> <option value="2" selected>2048</option> </select> </div> Country Name (국가): <input type="text" id="country" class="form-control"> State or Province Name (지역): <input type="text" id="state" class="form-control"> Locality Name (도시): <input type="text" id="locality" class="form-control"> Organization Name (기관): <input type="text" id="organization" class="form-control"> Organization Unit Name (부서): <input type="text" id="orgUnit" class="form-control"> Common Name (이름): <input type="text" id="common" class="form-control"> Email Address (이메일): <input type="text" id="email" class="form-control"> <br> <button id="certButton" class="btn btn-danger">인증서 발급 요청</button>

인증서 발급 신청 Forgecert.js – Client JS 요소이름 변수 생성 // Get Elements var certKeySize = element('certKeySize'); var country = element('country'); var state = element('state'); var locality = element('locality'); var organization = element('organization'); var orgUnit = element('orgUnit'); var common = element('common'); var email = element('email'); var userPub = element('userPub'); var userPriv = element('userPriv'); var userCert = element('userCert'); var caCert = element('caCert'); var verify = element('verify'); var fileSaveButton = element('fileSaveButton'); var lsSaveButton = element('lsSaveButton'); var readPrivateKey = element('readPrivateKey'); var readCert = element('readCert'); var readCaCert = element('readCaCert'); var userPriv1 = element('userPriv1'); var userCert1 = element('userCert1'); var caCert1 = element('caCert1'); var lsReadButton = element('lsReadButton'); var userPriv2 = element('userPriv2'); var userCert2 = element('userCert2'); var caCert2 = element('caCert2'); var verify2 = element('verify2'); var lsClearButton = element('lsClearButton');

인증서 발급 신청 Forgecert.js – Client JS var pki = forge.pki; // Connect to socket.io var socket = io.connect('http://127.0.0.1:5002'); //var socket = io.connect('http://isweb.joongbu.ac.kr:5002'); // Check for connection if(socket !== undefined){ console.log('Connected to socket...'); var publicKeyPem, privateKeyPem; var userCertPem, caCertPem; // 인증서 발급 요청 certButton.addEventListener('click', function(){ var optionSize = certKeySize.options[certKeySize.selectedIndex].value; var size; if (optionSize == "1") size = 1024; else if (optionSize == "2") size = 2048; var keypair = pki.rsa.generateKeyPair(size); var publicKey = keypair.publicKey; var privateKey = keypair.privateKey; privateKeyPem = pki.privateKeyToPem(privateKey); publicKeyPem = pki.publicKeyToPem(publicKey); userPub.value = publicKeyPem; userPriv.value = privateKeyPem; var req = { country: country.value, state: state.value, locality: locality.value, organization: organization.value, orgUnit: orgUnit.value, common: common.value, email: email.value, userPub: userPub.value } socket.emit('certReq', req); }); Forgecert.js – Client JS // 인증서 발급 응답 socket.on('certRes', function(data){ userCert.value = data.cert; caCert.value = data.caCert; userCertPem = data.cert; caCertPem = data.caCert; var uCert = pki.certificateFromPem(data.cert); var cCert = pki.certificateFromPem(data.caCert); var verified = cCert.verify(uCert); verify.value = verified; });

서버 운영을 위한 준비 프로젝트 폴더로 이동 서버측 패키지 설치 클라이언트측 패키지 설치 > npm install node-forge node_modules 폴더에 설치됨 서버측 프로그램에서 다음과 같이 불러서 사용 var forge = require('node-forge'); 클라이언트측 패키지 설치 > bower install forge bower_components 폴더에 설치됨 클라이언트 html 파일에서 forge.min.js 파일을 불러서 사용 <script src=bower_components\forge\dist\forge.min.js></script>

인증기관에서 사용할 자체서명인증서 생성 Cacert.js 개인키 파일 저장 - caPrivateKey.pem var forge = require('node-forge'); var fs = require('fs'); var pki = forge.pki; // 1. CA 인증서 생성 // generate a keypair and create an X.509v3 certificate var caKeys = pki.rsa.generateKeyPair(2048); var caCert = pki.createCertificate(); // CA 개인키 파일 저장 console.log(pki.privateKeyToPem(caKeys.privateKey)); fs.writeFileSync("caPrivateKey.pem", pki.privateKeyToPem(caKeys.privateKey)); console.log('CA개인키 저장 - caPrivateKey.pem \n'); caCert.publicKey = caKeys.publicKey; caCert.serialNumber = '01'; caCert.validity.notBefore = new Date(); caCert.validity.notAfter = new Date(); caCert.validity.notAfter.setFullYear(caCert.validity.notBefore.getFullYear() + 1); var caAttrs = [{ //name: 'commonName', // CN shortName: 'CN', value: 'Byoungcheon Lee' }, { //name: 'countryName', // C shortName: 'C', value: 'KR' //name: 'stateOrProvinceName', // ST shortName: 'ST', value: 'Gyeonggi-do' //name: 'localityName', // L shortName: 'L', value: 'Goyang-si' //name: 'organizationName', // O shortName: 'O', value: 'Joongbu Univ.' //name: 'organizationalUnitName', shortName: 'OU', value: 'Dept. of Information Security' }]; caCert.setSubject(caAttrs); caCert.setIssuer(caAttrs); caCert.setExtensions([{ name: 'basicConstraints', cA: true }, { name: 'keyUsage', keyCertSign: true, digitalSignature: true, nonRepudiation: true, keyEncipherment: true, dataEncipherment: true name: 'extKeyUsage', serverAuth: true, clientAuth: true, codeSigning: true, emailProtection: true, timeStamping: true name: 'nsCertType', client: true, server: true, email: true, objsign: true, sslCA: true, emailCA: true, objCA: true name: 'subjectAltName', altNames: [{ type: 6, // URI value: 'http://example.org/webid#me' type: 7, // IP ip: '127.0.0.1' }] name: 'subjectKeyIdentifier' }]); // self-sign certificate caCert.sign(caKeys.privateKey); console.log('CA 자체서명인증서 생성'); console.log(pki.certificateToPem(caCert)); var verified = caCert.verify(caCert); console.log('CA인증서 생성 후 검증: '+verified); console.log(); // CA 인증서 저장 fs.writeFileSync("caCert.pem", pki.certificateToPem(caCert)); console.log('CA인증서 저장 - caCert.pem'); 개인키 파일 저장 - caPrivateKey.pem 인증서 파일 저장 - caCert.pem

Server.js 파일 준비 Server.js // 파일 앞부분에 다음 내용 추가 const fs = require('fs'); const forge = require('node-forge'); const pki = forge.pki; const caCertPem = fs.readFileSync('caCert.pem', 'utf8'); const caPrivateKeyPem = fs.readFileSync('caPrivateKey.pem', 'utf8'); const caCert = pki.certificateFromPem(caCertPem); const caPrivateKey = pki.privateKeyFromPem(caPrivateKeyPem); forge, pki 객체 생성 CA의 개인키, 인증서를 파일에서 읽어옴 (파일이 같은 폴더에 있는지 확인)

서버의 인증서 발급 Server.js 사용자인증서와 Ca인증서를 리턴 cert.setExtensions([{ name: 'basicConstraints', cA: true }, { name: 'keyUsage', keyCertSign: true, digitalSignature: true, nonRepudiation: true, keyEncipherment: true, dataEncipherment: true name: 'extKeyUsage', serverAuth: true, clientAuth: true, codeSigning: true, emailProtection: true, timeStamping: true name: 'nsCertType', client: true, server: true, email: true, objsign: true, sslCA: true, emailCA: true, objCA: true name: 'subjectAltName', altNames: [{ type: 6, // URI value: 'http://example.org/webid#me' type: 7, // IP ip: '127.0.0.1' }] name: 'subjectKeyIdentifier' }]); 서버의 인증서 발급 Server.js socket.on('certReq', function(req){ var pki = forge.pki; var rsa = forge.pki.rsa; var cert = pki.createCertificate(); cert.publicKey = pki.publicKeyFromPem(req.userPub); cert.serialNumber = '01'; cert.validity.notBefore = new Date(); cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1); var userAttrs = [{ name: 'commonName', value: req.common }, { name: 'countryName', value: req.country shortName: 'ST', value: req.state name: 'localityName', value: req.locality name: 'organizationName', value: req.organization shortName: 'OU', value: req.orgUnit }]; cert.setSubject(userAttrs); cert.sign(caPrivateKey); var result = { cert: pki.certificateToPem(cert), caCert: pki.certificateToPem(caCert) }; socket.emit('certRes', result); }); var caAttrs = [{ name: 'commonName', value: caCert.subject.getField('CN').value }, { name: 'countryName', value: caCert.subject.getField('C').value shortName: 'ST', value: caCert.subject.getField('ST').value name: 'localityName', value: caCert.subject.getField('L').value name: 'organizationName', value: caCert.subject.getField('O').value shortName: 'OU', value: caCert.subject.getField('OU').value }]; cert.setIssuer(caAttrs); 사용자인증서와 Ca인증서를 리턴

인증서 발급 응답 Forgecert.js – Client JS // 인증서 발급 응답 socket.on('certRes', function(data){ userCert.value = data.cert; caCert.value = data.caCert; userCertPem = data.cert; caCertPem = data.caCert; var uCert = pki.certificateFromPem(data.cert); var cCert = pki.certificateFromPem(data.caCert); var verified = cCert.verify(uCert); verify.value = verified; });

발급 결과 표시 Forgecert.html - UI 화면에 표시 파일로 저장하기 로컬스토리지에 저장하기 <hr> <h1>인증서 발급 결과</h1> RSA public key: <textarea class="form-control" rows="5" id="userPub" readonly></textarea> RSA private key: <textarea class="form-control" rows="5" id="userPriv" readonly></textarea> Certificate: <textarea class="form-control" rows="5" id="userCert" readonly></textarea> CA Certificate: <textarea class="form-control" rows="5" id="caCert" readonly></textarea> 인증서 검증 결과: <input type="text" id="verify" class="form-control" readonly> <button id="fileSaveButton" class="btn btn-primary">개인키, 인증서를 파일로 저장하기</button> <button id="lsSaveButton" class="btn btn-primary">개인키, 인증서를 로컬스토리지에 저장하기</button> <p id="filestatus"></p> 화면에 표시 파일로 저장하기 로컬스토리지에 저장하기

저장하기 Forgecert.js – Client JS function infolabel(str, append) { if (append) $('#filestatus')[0].innerHTML += str; else $('#filestatus')[0].innerHTML = str; } fileSaveButton.addEventListener('click', function(){ var uripridata = 'data:application/text;charset=utf-8,' + encodeURIComponent(privateKeyPem); // 개인키(PEM) var uricerdata = 'data:application/text;charset=utf-8,' + encodeURIComponent(userCertPem); // 인증서(CER) var uricacerdata = 'data:application/text;charset=utf-8,' + encodeURIComponent(caCertPem); // 인증서(CER) infolabel('앞으로 인증서를 활용하려면 다음의 인증서 파일과 개인키 파일을 다운로드 받아 저장하세요.<br />', 1); infolabel('<a href=' + uripridata + ' download=\"userPrivateKey.pem\">개인키 파일 저장 - userPrivateKey.pem </a> <br>', 1); infolabel('<a href=' + uricerdata + ' download=\"userCert.pem\">인증서 파일 저장 - userCert.pem </a> <br>', 1); infolabel('<a href=' + uricacerdata + ' download=\"caCert.pem\">CA 인증서 파일 저장 - caCert.pem </a> <br>', 1); }); lsSaveButton.addEventListener('click', function(){ localStorage.setItem('priv', privateKeyPem); localStorage.setItem('cert', userCertPem); localStorage.setItem('cacert', caCertPem);

파일에서 읽어오기 Forgecert.html <hr> <h1>개인키, 인증서를 파일에서 읽어오기</h1> 개인키 읽어오기: userPrivateKey.pem <input type="file" id="readPrivateKey" /> <br> 인증서 읽어오기: userCert.pem <input type="file" id="readCert" /> <br> CA인증서 읽어오기: caCert.pem <input type="file" id="readCaCert" /> <br> User private key: <textarea class="form-control" rows="5" id="userPriv1" readonly></textarea> User Certificate: <textarea class="form-control" rows="5" id="userCert1" readonly></textarea> CA Certificate: <textarea class="form-control" rows="5" id="caCert1" readonly></textarea>

파일에서 읽어오기 readPrivateKey.addEventListener('change', readPrivFile); readCert.addEventListener('change', readCertFile); readCaCert.addEventListener('change', readCaCertFile); function readPrivFile(e) { var file = e.target.files[0]; if (!file) return; var reader = new FileReader(); reader.onload = function(e) { var contents = e.target.result; userPriv1.value = contents; }; reader.readAsText(file); } function readCertFile(e) { userCert1.value = contents; function readCaCertFile(e) { caCert1.value = contents; Forgecert.js

로컬스토리지에서 읽어오기 Forgecert.html <hr> <h1>개인키, 인증서를 로컬스토리지에서 읽어오기</h1> <button id="lsReadButton" class="btn btn-primary">개인키, 인증서를 로컬스토리지에서 읽어오기</button> <button id="lsClearButton" class="btn btn-primary">로컬스토리지 지우기</button> <br> User private key: <textarea class="form-control" rows="5" id="userPriv2" readonly></textarea> User Certificate: <textarea class="form-control" rows="5" id="userCert2" readonly></textarea> CA Certificate: <textarea class="form-control" rows="5" id="caCert2" readonly></textarea> 인증서 검증 결과: <input type="text" id="verify2" class="form-control" readonly>

로컬스토리지에서 읽어오기 Forgecert.js lsReadButton.addEventListener('click', function(){ userPriv2.value = localStorage.getItem('priv'); userCert2.value = localStorage.getItem('cert'); caCert2.value = localStorage.getItem('cacert'); var uCert = pki.certificateFromPem(localStorage.getItem('cert')); var cCert = pki.certificateFromPem(localStorage.getItem('cacert')); var verified = cCert.verify(uCert); verify2.value = verified; }); lsClearButton.addEventListener('click', function(){ userPriv2.value=''; userCert2.value=''; caCert2.value=''; localStorage.clear();

공용서버에서 운영하기 클라이언트 자바스크립트 파일의 소켓접속주소 확인 Forgecert.js – 로컬 운영시 // Connect to socket.io var socket = io.connect('http://127.0.0.1:5002'); //var socket = io.connect('http://isweb.joongbu.ac.kr:5002'); Forgecert.js – 공용서버 운영시 // Connect to socket.io //var socket = io.connect('http://127.0.0.1:5002'); var socket = io.connect('http://isweb.joongbu.ac.kr:5002');