김핵센
핵센의 개발공부로그
김핵센
전체 방문자
오늘
어제
  • 분류 전체보기 (66)
    • 창업 (1)
    • Flutter (1)
    • Javascript (9)
    • Git 강의 (2)
    • 항해99 (11)
    • 알고리즘 (25)
    • Node.js (11)
    • Network (1)
    • Database (2)
    • AWS (1)
    • Nest.js (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 1주차 마무리
  • searchParams
  • 내장 모듈
  • github
  • 혼자 공부하는 자바스크립트
  • Wil
  • 혼자공부하는자바스크립트
  • 가장 가까운 같은 글자
  • worker_threads
  • 프로그래머스
  • 명예의 전당 (1)
  • til
  • JavaScript
  • 크기가 작은 부분문자열
  • 알고리즘
  • 혼공스
  • 주특기 입문주차
  • 제로초
  • node.js
  • 스파르타코딩클럽
  • 주특기입문주차
  • 팀과제
  • 항해99
  • git
  • 창업 노하우
  • 푸드 파이트 대회
  • 창VOD
  • 주특기주차
  • 추억 점수
  • 내장모듈

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김핵센

핵센의 개발공부로그

Node.js 내장 모듈 - crypto
Node.js

Node.js 내장 모듈 - crypto

2023. 5. 6. 02:11

오늘은 Node.js 내장 모듈인 crypto에 대해 알아볼 것이다.

crypto는 단방향 암호화를 제공하는 모듈로서 암호화는 가능하지만 복호화는 불가능하다.

  • 암호화: 평문을 암호로 만듦
  • 복호화: 암호를 평문으로 해독

단방향 암호화의 대표 주자는 해시(Hash) 기법이다.

해시(Hash)란 임의의 길이의 데이터를 고정된 길이의 값으로 변환하는 것을 말한다.
이 변환된 값은 해시값이라고 하며, 보통은 숫자와 문자로 이루어진 고정된 길이의 문자열이다.
해시 함수는 입력값을 고정된 길이의 해시값으로 변환하는 함수를 말한다. 

해시 함수는 다양한 목적으로 사용된다.

 

가장 일반적인 사용 예시는 데이터 무결성 검증이다.

 

데이터 무결성이란, 데이터가 변경되지 않았음을 보장하는 것을 의미한다.

예를 들어, 어떤 파일이 전송되거나 저장될 때, 해당 파일의 해시값을 생성하여 저장한다. 이후에 파일의 내용이 변경되었는지 확인하려면, 파일의 해시값을 다시 생성하여 저장된 해시값과 비교하면 된다. 만약 해시값이 다르면, 파일의 내용이 변경되었음을 의미한다.

 

또 다른 사용 예시는 비밀번호 저장이다.

 

사용자의 비밀번호를 해시값으로 변환하여 저장하면, 실제 비밀번호를 저장하지 않으면서도, 비밀번호가 올바른지 검증할 수 있다. Node.js에서는 crypto 모듈을 통해 다양한 해시 함수를 제공한다.

대표적인 해시 함수로는 SHA-1, MD5, SHA-256, SHA-512 등이 있다.

SHA-1, MD5는 취약점이 발견되었기 때문에 SHA-512를 사용하는 것을 추천한다.
하지만, 해시 함수의 안전성은 시간이 지남에 따라 변화할 수 있기 때문에 항상 최신 정보를 참고하여 사용하는 것이 좋다.
또한, 해시 함수를 사용할 때는 적절한 Salt와 함께 사용하고, 해시 함수의 출력값을 추가적인 변환을 거쳐 사용하는 등의 보안 조치를 취하는 것이 중요하다.

이러한 해시 함수를 사용하여 데이터의 무결성 검증이나 비밀번호 저장 등의 보안 기능을 구현할 수 있다.

 

사용 방법

hash.js

const crypto = require('crypto');

console.log('base64:', crypto.createHash('sha512').update('비밀번호').digest('base64'));
console.log('hex:', crypto.createHash('sha512').update('비밀번호').digest('hex'));
console.log('base64:', crypto.createHash('sha512').update('다른 비밀번호').digest('base64'));

crypto 모듈의 createHash() 함수를 사용하여 sha512 해시 객체를 생성한다. 이 해시 객체에 update() 함수를 사용하여 암호화할 문자열 '비밀번호'를 전달하고, digest() 함수를 사용하여 출력 형식을 base64로 설정하여 암호화된 문자열을 생성한다.

 

콘솔 결과

PBKDF2(Password-Based Key Derivation Function 2) 함수를 사용하면 Salt를 사용하여 중간 값(Intermediate Value)을 생성하고, 이 중간 값에서 많은 반복(iteration)을 거쳐 최종적인 키를 생성한다.

이때 반복 횟수(iteration count)는 보안 강도에 따라 조정된다.

PBKDF2는 입력값에 대해 일관된 출력을 생성하며, 랜덤한 솔트를 사용하여 레인보우 테이블(Rainbow Table) 공격 등을 방지한다.

 

pbkdf2.js

const crypto = require('crypto');

crypto.randomBytes(64, (err, buf) => {
  const salt = buf.toString('base64');
  console.log('salt:', salt);
  crypto.pbkdf2('비밀번호', salt, 100000, 64, 'sha512', (err, key) => {
    console.log('password:', key.toString('base64'));
  });
});

콘솔 결과

양방향 암호화

crypto 모듈은 대칭키 암호화를 통한 양방향 암호화 기능을 제공한다.

대칭키 암호화는 하나의 키를 이용해 암호화와 복호화를 동시에 처리할 수 있는 방식이다.

이를 통해 데이터를 암호화할 때 사용한 키와 같은 키를 이용해 암호화된 데이터를 복호화할 수 있다.

사용 방법

cipher.js

const crypto = require('crypto');

const algorithm = 'aes-256-cbc';
const key = 'abcdefghijklmnopqrstuvwxyz123456';
const iv = '1234567890123456';

const cipher = crypto.createCipheriv(algorithm, key, iv);
let result = cipher.update('암호화할 문장', 'utf8', 'base64');
result += cipher.final('base64');
console.log('암호화:', result);

const decipher = crypto.createDecipheriv(algorithm, key, iv);
let result2 = decipher.update(result, 'base64', 'utf8');
result2 += decipher.final('utf8');
console.log('복호화:', result2);

콘솔 결과

기본 Node의 crypto는 암호학 지식이 있어야만 원할하게 사용할 수 있기에 crypto-js 를 사용하는 것을 추천한다.

'Node.js' 카테고리의 다른 글

Node.js 내장 모듈 - worker_threads  (2) 2023.05.12
Node.js 내장 모듈 - util  (0) 2023.05.10
Node.js 내장 모듈 - url  (0) 2023.05.04
Node.js 내장 모듈 - path  (0) 2023.05.03
Node.js 내장 모듈 - os  (0) 2023.05.01
    'Node.js' 카테고리의 다른 글
    • Node.js 내장 모듈 - worker_threads
    • Node.js 내장 모듈 - util
    • Node.js 내장 모듈 - url
    • Node.js 내장 모듈 - path
    김핵센
    김핵센
    개발 공부 관련 글을 적는 블로그입니다.

    티스토리툴바