암호학 응용 Applied cryptography 2017. 9. 중부대학교 정보보호학과 이병천 교수
차례 1. 강의 개요 2. Javascript Cryptography 3. Node.js crypto 4. Crypto-js 5. Forge 6. Web Crypto API
4. Crypto-js 서버측 프로그래밍 클라이언트측 프로그래밍
자바스크립트 암호 라이브러리 Crypto-js 구글에서 만든 자바스크립트 암호 라이브러리 https://www.npmjs.com/package/crypto-js 설치: > npm install crypto-js
프로젝트 준비 프로젝트 폴더 생성 패키지 설치 (서버측) 패키지 설치 (클라이언트측) > 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)
서버측 프로그래밍
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);
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);
Pbkdf2 var CryptoJS = require("crypto-js"); var password = 'Secret Passphrase'; console.log('Password: '+password); var salt = CryptoJS.lib.WordArray.random(128/8); var key128Bits = CryptoJS.PBKDF2(password, salt, { keySize: 128/32 }); var key256Bits = CryptoJS.PBKDF2(password, salt, { keySize: 256/32 }); var key512Bits = CryptoJS.PBKDF2(password, salt, { keySize: 512/32 }); var key128Bits1000Iterations = CryptoJS.PBKDF2(password, salt, { keySize: 128/32, iterations: 1000 }); var key256Bits1000Iterations = CryptoJS.PBKDF2(password, salt, { keySize: 256/32, iterations: 1000 }); var key512Bits1000Iterations = CryptoJS.PBKDF2(password, salt, { keySize: 512/32, iterations: 1000 }); console.log('key(128bits): '+key128Bits); console.log('key(256bits): '+key256Bits); console.log('key(512bits): '+key512Bits); console.log('key(128bits,1000it): '+key128Bits1000Iterations); console.log('key(256bits,1000it): '+key256Bits1000Iterations); console.log('key(512bits,1000it): '+key512Bits1000Iterations); console.log();
대칭키 암호 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);
클라이언트측 프로그래밍
방법론 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) 브라우저로 접속하여 동작 확인
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 함수를 사용 가능 서버측 프로그래밍 클라이언트측 프로그래밍
과제물 2 Crypto-js의 서버측 프로그램들을 클라이언트에서 동작 하도록 웹페이지를 만들고 자신의 홈페이지에 링크하시 오.