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 지원


- 컴퓨터의 발달로 기존 암호화 알고리즘이 위협받고 있음
- 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도 있지만 자주 사용되지는 않습니다.
- 바꿀 함수를 인자로 제공하면 됩니다. 이렇게 바꾸어두면 async/await 패턴까지 사용할 수 있어 좋습니다.

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 |