Presentation is loading. Please wait.

Presentation is loading. Please wait.

웹어플리케이션보안 암호프로그래밍, crypto-js

Similar presentations


Presentation on theme: "웹어플리케이션보안 암호프로그래밍, crypto-js"— Presentation transcript:

1 웹어플리케이션보안 암호프로그래밍, crypto-js 2017. 9.
중부대학교 정보보호학과 이병천 교수

2 자바스크립트 암호 라이브러리 Crypto-js 구글에서 만든 자바스크립트 암호 라이브러리
설치: > npm install crypto-js

3 프로젝트 준비 프로젝트 폴더 생성 패키지 설치 (서버측) 패키지 설치 (클라이언트측) > md crypto-js
> npm install crypto-js node_modules/crypto-js 에 설치됨 패키지 설치 (클라이언트측) > npm install –g bower > bower install crypto-js bower_components/crypto-js 에 설치됨 npm (Node.js package manager) bower (package manager for frontend)

4 암호프로그래밍 해쉬함수, 메시지인증코드 대칭키암호

5 해쉬함수 X 해쉬함수(hash function)란? 임의의 길이의 데이터를 입력받아서 고정된 길이의 특징값을 출력하는 함수
임의의 길이의 데이터를 입력받아서 고정된 길이의 특징값을 출력하는 함수 메시지 다이제스트(message digest)라고도 부름 암호키를 사용하지 않는 공개된 함수. 동일한 입력값에 대해 항상 동일한 해쉬값 을 출력함 입력값으로부터 해쉬값을 계산하는 것은 쉽 지만 해쉬값으로부터 그것을 출력하는 입력 값을 찾는 것은 어려움 Message M H X Message Digest D D = H(M)

6 해쉬함수 해쉬함수의 요구조건 역상 저항성(Pre-image resistance): 주어진 출력에 대하여 입력 값을 구하는 것이 계산상 불가능하다. 제2 역상 저항성(Second pre-image resistance): 주어진 입력에 대하여 같은 출력을 내는 또 다른 입력을 찾아내는 것이 계산상 불가능하다. 충돌저항성(Collision resistance): 같은 출력을 내는 임의의 서로 다른 두 입력 메세지를 찾는 것이 계산상 불가능하다.

7 해쉬함수의 용도 메시지 다이제스트: 문서의 위조 방지 안전한 난수생성 패스워드 저장 체크섬 생성 및 검증
해쉬값을 생성하여 함께 제공 전자서명과 함께 사용 안전한 난수생성 SecureRandom에서 해쉬함수를 이용 패스워드 저장 사용자의 패스워드를 서버에서는 암호화된 해쉬값으로 저장 패스워드 기반 키생성 알고리즘 (PBKDF2) 체크섬 생성 및 검증 인터넷으로 배포되는 소프트웨어의 원본 보증

8 해쉬함수 해쉬 알고리즘 Md5 Sha1 Sha256 Sha384 Sha512

9 Hash, 해쉬함수 – 서버측 프로그래밍 var CryptoJS = require("crypto-js");
var plaintext = 'message to hash'; console.log('Plaintext: '+plaintext); console.log('MD5: '+CryptoJS.MD5(plaintext)); console.log('SHA1: '+CryptoJS.SHA1(plaintext)); console.log('SHA256: '+CryptoJS.SHA256(plaintext)); console.log('SHA384: '+CryptoJS.SHA384(plaintext)); console.log('SHA512: '+CryptoJS.SHA512(plaintext)); console.log('SHA3(224): '+CryptoJS.SHA3(plaintext, { outputLength: 224 })); console.log('SHA3(256): '+CryptoJS.SHA3(plaintext, { outputLength: 256 })); console.log('SHA3(384): '+CryptoJS.SHA3(plaintext, { outputLength: 384 })); console.log('SHA3(512): '+CryptoJS.SHA3(plaintext, { outputLength: 512 })); console.log(); var hash = CryptoJS.SHA256(plaintext); console.log('SHA256-Hex: '+hash); console.log('SHA256-Base64: '+hash.toString(CryptoJS.enc.Base64)); var sha256 = CryptoJS.algo.SHA256.create(); sha256.update("Message Part 1"); sha256.update("Message Part 2"); sha256.update("Message Part 3"); var hash = sha256.finalize(); console.log('SHA256-ProgressiveHash: '+hash);

10 해쉬함수 – 클라이언트측 프로그래밍 Html 문서 작성 자바스크립트 Crypto-js 를 링크하여 포함
<script src="bower_components/crypto-js/crypto- js.js"></script> <script></script> 태그 내부에 js 프로그램 작성 또는 별도의 js 파일을 만들고 script 태그로 링크 출력 명령 변경 브라우저 화면에 출력하려면 console.log() 함수를 대신하여 document.write() 함수 이용 console.log 함수의 출력결과는 브라우저 콘솔에서 볼 수 있음 (F12/console) 브라우저로 접속하여 동작 확인

11 Hash, 클라이언트측 똑같은 crypto-js 함수를 사용 가능 서버측 프로그래밍 클라이언트측 프로그래밍
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Hash Test with crypto-js</title> <script src="bower_components/crypto-js/crypto-js.js"></script> <script type="text/javascript"> var plaintext = 'message to hash'; document.write('Plaintext: '+plaintext+'<br>'); document.write('MD5: '+CryptoJS.MD5(plaintext)+'<br>'); document.write('SHA1: '+CryptoJS.SHA1(plaintext)+'<br>'); document.write('SHA256: '+CryptoJS.SHA256(plaintext)+'<br>'); document.write('SHA384: '+CryptoJS.SHA384(plaintext)+'<br>'); document.write('SHA512: '+CryptoJS.SHA512(plaintext)+'<br>'); document.write('SHA3(224): '+CryptoJS.SHA3(plaintext, { outputLength: 224 })+'<br>'); document.write('SHA3(256): '+CryptoJS.SHA3(plaintext, { outputLength: 256 })+'<br>'); document.write('SHA3(384): '+CryptoJS.SHA3(plaintext, { outputLength: 384 })+'<br>'); document.write('SHA3(512): '+CryptoJS.SHA3(plaintext, { outputLength: 512 })+'<br>'); document.write('<br>'); var hash = CryptoJS.SHA256(plaintext); document.write('SHA256-Hex: '+hash+'<br>'); document.write('SHA256-Base64: '+hash.toString(CryptoJS.enc.Base64)+'<br>'); var sha256 = CryptoJS.algo.SHA256.create(); sha256.update("Message Part 1"); sha256.update("Message Part 2"); sha256.update("Message Part 3"); var hash = sha256.finalize(); document.write('SHA256-ProgressiveHash: '+hash+'<br>'); </script> </head> <body> </body> </html> 똑같은 crypto-js 함수를 사용 가능 서버측 프로그래밍 클라이언트측 프로그래밍

12 MAC (메시지인증코드) MAC(메시지인증코드)란? MAC: Message Authentication Code
해쉬함수와 공유된 비밀키를 이용하여 송수신하는 메시지의 원 본성을 인증하는데 사용 MAC은 대칭키 암호알고리즘처럼 송신자와 수신자 사이의 공유 된 비밀키가 필요 MAC 계산에는 공유된 비밀키를 이용하므로 송신자와 수신자만 계산하고 검증할 수 있음. 송신하는 메시지의 인증성을 제공. 중간에서 공격자가 메시지를 변조하는 것을 방지 가능 송신자는 입력메시지와 비밀키를 이용하여 hmac 계산하여 전송. 수신자는 전송된 메시지와 비밐리를 이용하여 hmac 값이 맞는 지 검증.

13 MAC

14 Hash와 MAC의 비교 Hash MAC

15 MAC의 한계 제3자에게 MAC의 유효성 여부를 증명하지 못함 부인방지 불가
이것을 증명하려면 공유된 비밀키를 제3자에게 공개해야 함 부인방지 불가 송신자가 메시지를 보내지 않았다고 부인하는 경우 분쟁 해결이 어려움. 수신자도 동일한 MAC을 계산할 수 있기 때문 부인방지 기능을 제공하기 위해서는 전자서명을 사용

16 Hmac, 메시지인증코드 var CryptoJS = require("crypto-js");
var plaintext = 'message to hash'; var key = 'super secret key'; console.log('Plaintext: '+plaintext); console.log('Key: '+key); console.log('HmacMD5: '+CryptoJS.HmacMD5(plaintext, key)); console.log('HmacSHA1: '+CryptoJS.HmacSHA1(plaintext, key)); console.log('HmacSHA256: '+CryptoJS.HmacSHA256(plaintext, key)); console.log('HmacSHA384: '+CryptoJS.HmacSHA384(plaintext, key)); console.log('HmacSHA512: '+CryptoJS.HmacSHA512(plaintext, key)); console.log(); var hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, "Secret Passphrase"); hmac.update("Message Part 1"); hmac.update("Message Part 2"); hmac.update("Message Part 3"); var hash = hmac.finalize(); console.log('HmacSHA256-progressive: '+hash);

17 대칭키 암호 송신자와 수신자가 동일한 비밀키를 공유 비밀키를 이용한 메시지 암호화 동일한 비밀키를 이용한 암호문 복호화
암호 알고리즘 AES, DES, 3DES

18 대칭키 암호 방식

19 대칭키 암호 방식 데이터를 변환하는 단위에 따라 블록 암호와 스트림 암 호로 분류
블록암호: 고정된 크기의 블록 단위로 암호화/복호화 스트림암호: 난수열을 생성하여 비트단위, 글자단위로 암호화/복 호화 블록암호 스트림암호

20 블록 암호 알고리즘 DES 3DES (DESede) AES 1977년 NBS(미국 표준국)에서 미국 표준 알고리즘으로 채택
64비트 블록단위 암호화, 56비트 키길이 짧은 키길이로 인한 취약성으로 현재는 사용하지 않음 Feistel 구조 3DES (DESede) DES 암호를 암호화->복호화->암호화 순으로 3번 반복 블록 크기가 64비트, 느린 속도 AES 2001년 DES를 교체하기 위해 새롭게 제정한 암호 표준 128/192/256 비트의 키길이, 10/12/14 라운드 사용 SPN(Substitution Permutation Network) 구조

21 블록 암호 알고리즘 SEED ARIA 1999년 2월 국내에서 개발한 128비트 블록암호알고리즘
국내 표준, ISO/IEC 국제 표준 SEED128, SEED256 ARIA 경량 환경, 하드웨어 구현 최적화된 128비트 블록암호알고리즘 128/192/256비트의 키길이, 12/14/16 라운드

22 대칭키 암호화 var CryptoJS = require("crypto-js");
var plaintext = 'message to encrypt'; var key = 'supersecretkey'; console.log('Plaintext: '+plaintext); console.log('Key: '+key); // AES var ciphertext = CryptoJS.AES.encrypt(plaintext, key); console.log('Ciphertext: '+ciphertext); var bytes = CryptoJS.AES.decrypt(ciphertext.toString(), key); var decrypted = bytes.toString(CryptoJS.enc.Utf8); console.log('Decrypted: '+decrypted); // DES var ciphertext = CryptoJS.DES.encrypt(plaintext, key); var bytes = CryptoJS.DES.decrypt(ciphertext.toString(), key); // TripleDES var ciphertext = CryptoJS.TripleDES.encrypt(plaintext, key); var bytes = CryptoJS.TripleDES.decrypt(ciphertext.toString(), key);


Download ppt "웹어플리케이션보안 암호프로그래밍, crypto-js"

Similar presentations


Ads by Google