-
[nodejs] 암호화 - crypto 모듈Web 2019. 5. 31. 03:28
사전지식
- 암호학
- 문자 인코딩 개념(base64, hex, ascii, utf8)
*암호함수는 비트열이 담긴 버퍼를 생성하는 것이기 때문에
이것을 어떤방식으로 읽을지(문자 인코딩방식)를 지정해야한다.
nodejs crypto 모듈 레퍼런스
https://nodejs.org/api/crypto.html
nodejs 내장모듈임
crypto패키지 에서 제공되는 암호화 기법
-대칭키/비대칭키 암호
-Hash
-DH(Diffie Hellman)
-ECDH
-Hmac
-Sign
-Verify
-Certificate
자주쓰이는 함수
- buffer.toString()
buffer.toString(인코딩)- randomBytes() :
randomBytes(바이트수, callback(error, buffer){ });- getCiphers() : 모듈이 지원하는 암호알고리즘 목록 리턴
console.log(crypto.getCiphers()) // [ 'aes-128-cbc', 'aes-128-cbc-hmac-sha1', ... ]update(평문, [인풋인코딩], [아웃풋인코딩])
digest(인코딩)
Hash : Hash 클래스
Hash 클래스의 메소드
update(data) : data 해싱
digest(encoding) : encoding 방식에 따라 결과값을 가져올 수 있음
*비트열을 생성하는것이기 때문에 문자인코딩 필요
- createHash(해쉬알고리즘)
let hash = crypto.createHash("sha256"); //Hash 객체 반환 hash = hash.update(평문); //평문데이터 업데이트 const digest = hash.digest("base64"); //다이제스트(해시값) 생성 및 인코딩- pbkdf2() : 솔트 + 키스트레칭(해쉬반복)
crypto.pbkdf2(평문, salt값, 반복횟수, 키길이, 해시알고리즘, callback(error, key){ })해시알고리즘은 빠르므로 수행시간이 최소 0.1초 이상 걸리도록 반복횟수 설정
key 또한 buffer 형식이므로 인코딩필요
콜백있으니 이건 비동기처리다
동기는
let keyBuf = crypto.pbkdf2Sync(평문, 솔트, 반복횟수,키길이, 해시알고리즘)리턴값은 key buffer
해쉬는 단방향이므로 복호화 함수는 존재하지 않음
지원하는 해쉬함수
대칭키 암호화
대칭키방식은 키를 클라이언트와 공유해야하기 때문에 웹에서는 잘 사용하기 힘듬
암호화
const cipher = createCipher(대칭키알고리즘, 키값); //Ciphper 객체반환 let cipherText = cipher.update(평문, 입력값 인코딩방식, 출력값 인코딩방식); //암호화적용 cipherText += cipher.final(출력인코딩방식);final(encoding)
마지막 블록만 인코딩. 평문의 길이가 길면 에러발생
복호화
const decipher = createDeCipher(대칭키알고리즘, 키값); //Decipher 객체반환 let plainText = decipher.update(암호문, 출력할인코딩방식, 입력값인코딩방식); //buffer 형식 plainText += decipher.final(출력인코딩방식);
Hmac
const hmac = crypto.createHmac(해시알고리즘, 암호화키); const cipherText hmac.update(평문).digest(출력인코딩방식);'Web' 카테고리의 다른 글
[Error] return undefined (0) 2019.11.21 클라이언트에서 서버로 데이터 전송(form/ajax-xml, fetch/WebSocket) (0) 2019.05.29 사용자 인증(로그인) 방식 (0) 2019.05.27 [nodejs] express 사용하기 (0) 2019.05.25 [Web] quick nodejs (0) 2019.05.25