Node/노드 기능

crypto와 util

webmaster 2022. 7. 24. 16:14
728x90

암호화는 멀티 스레드로 돌아간다.

암호화는 가능하지만 복호화는 불가능

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

단방향 암호화의 대표 주자는 해시 기법

  • 문자열을 고정된 길이의 다른 문자열로 바꾸는 방식
  • 어떤 문자열을 hash함수를 통해 나온 결과는 항상 같기 때문에, 해시 결과만 저장하면 된다.

해시 기법(해시 함수)

Hash

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')));
  • createHash(알고리즘): 사용할 해시 알고리즘을 넣어줍니다. 
    • md5, sha1, sha256, sha512 등이 가능하지만, md5와 sha1은 이미 취약점이 발견되었습니다.
    • 현재는 sha512 정도로 충분하지만, 나중에 sha512마저도 취약해지면 더 강화된 알고리즘으로 바꿔야 합니다.
  • update(문자열): 변환할 문자열을 넣어줍니다.
  • digest(인코딩): 인코딩할 알고리즘을 넣어줍니다.
    • base64, hex, latin1이 주로 사용되는데, 그중 base64가 결과 문자열이 가장 짧아 애용됩니다. 결과물로 변환된 문자열을 반환합니다 

Pbkdf2

컴퓨터의 발달로 기존 암호화 알고리즘이 위협받고 있음

  • sha512가 취약해지면 sha3으로 넘어가야함
  • 현재는 pbkdf2나, bcrypt, scrypt 알고리즘으로 비밀번호를 암호화(bcrypt를 많이 사용한다)
  • Node는 pbkdf2와 scrypt 지원

pbkdf2

  • 컴퓨터의 발달로 기존 암호화 알고리즘이 위협받고 있음
  • crypto.randomBytes로 64바이트 문자열 생성 -> salt 역할
  • pbkdf2 인수로 순서대로 비밀번호, salt, 반복 횟수, 출력 바이트, 알고리즘
  • 반복 횟수를 조정해 암호화하는 데 1초 정도 걸리게 맞추는 것이 권장됨

양방향 암호화

대칭형 암호화(암호문 복호화 가능)

  • Key가 사용됨
  • 암호화할 때와 복호화할 때 같은 Key를 사용해야 함

  • crypto.createCipheriv(알고리즘, 키, iv): 암호화 알고리즘과 키, 초기화 벡터를 넣어줍니다.
    • 암호화 알고리즘은 aes-256-cbc를 사용했습니다. 다른 알고리즘을 사용해도 됩니다.
    • 사용 가능한 알고리즘 목록은 crypto.getCiphers()를 하면 볼 수 있습니다.
    • 키는 32바이트, 초기화 벡터(iv)는 16바이트로 고정입니다.
  • cipher.update(문자열, 인코딩, 출력 인코딩): 암호화할 대상과 대상의 인코딩, 출력 결과물의 인코딩을 넣어줍니다.
    • 보통 문자열은 utf8 인코딩을, 암호는 base64를 많이 사용합니다.
  • cipher.final(출력 인코딩): 출력 결과물의 인코딩을 넣어주면 암호화가 완료됩니다.
  • crypto.createDecipheriv(알고리즘, 키, iv): 복호화할 때 사용합니다. 암호화할 때 사용했던 알고리즘과 키, iv를 그대로 넣어주어야 합니다.
  • decipher.update(문자열, 인코딩, 출력 인코딩): 암호화된 문장, 그 문장의 인코딩, 복호화할 인코딩을 넣어줍니다.
    • createCipher의 update()에서 utf8, base64 순으로 넣었다면 createDecipher의 update()에서는 base64, utf8 순으로 넣으면 됩니다.
  • decipher.final(출력 인코딩): 복호화 결과물의 인코딩을 넣어줍니다.

Util

각종 편의 기능을 모아둔 모듈( deprecated promisify 자주 쓰임)

  • 기존 코드를 바로 제거하면은 오류가 발생하기 때문에, deprecated와 같은 함수를 사용해 미리 경고하고 차근차근 업그레이드가 가능하다
  • util.deprecate: 함수가 deprecated 처리되었음을 알려줍니다.  
    • 첫 번째 인자로 넣은 함수를 사용했을 때 경고 메시지가 출력됩니다. 
    • 두 번째 인자로 경고 메시지 내용을 넣으면 됩니다. 함수가 조만간 사라지거나 변경될 때 알려줄 수 있어 유용합니다.
  • util.promisify: 콜백 패턴을 프로미스 패턴으로 바꿔줍니다. 
    • 바꿀 함수를 인자로 제공하면 됩니다. 이렇게 바꾸어두면 async/await 패턴까지 사용할 수 있어 좋습니다.
      • 단, 콜백이(error, data) => {} 형식이어야 한다
    • 3.5.5.1절의 randomBytes와 비교해보세요. 프로미스를 콜백으로 바꾸는 util.callbackify도 있지만 자주 사용되지는 않습니다.

728x90

'Node > 노드 기능' 카테고리의 다른 글

child_process  (0) 2022.07.24
worker_threads  (0) 2022.07.24
Url과 querystring  (0) 2022.07.24
os와 path  (0) 2022.07.24
process  (0) 2022.07.23