Node.js

암호화(단방향 :crypto, pbkdf2, 양방향), util

쿠와와 2020. 12. 10. 16:49

암호화는 CPU를 많이 잡아 먹어 멀티 쓰레드로 돌아간다. 

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

암호화: 평문을 암호로 만듦

복호화: 암호를 평문으로 해독

 

비밀번호는 해시 !!

 

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

문자열을 고정된 길이의 다른 문자열로 바꾸는 방식

항상 같은 input에는 같은 output이 나옴

abcdefgh 문자열 -> qvew

 

createHash(알고리즘): 사용할 해시 알고리즘을 넣어줍니다.

md5, sha1, sha256, sha512 등이 가능하지만, md5sha1은 이미 취약점이 발견되었습니다.

현재는 sha512 정도로 충분하지만, 나중에 sha512마저도 취약해지면 더 강화된 알고리즘으로 바꿔야 합니다.

 

update(문자열): 변환할 문자열을 넣어줍니다.

digest(인코딩): 인코딩할 알고리즘을 넣어줍니다.

base64, hex, latin1이 주로 사용되는데, 그중 base64가 결과 문자열이 가장 짧아 애용됩니다. 결과물로 변환된 문자열을 반환합니다.

 

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

sha512가 취약해지면 sha3으로 넘어가야합니다.

현재는 pbkdf2, bcrypt, scrypt 알고리즘으로 비밀번호를 암호화

Nodepbkdf2scrypt 지원

 

pbkdf2

 

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

crypto.randomBytes64바이트 문자열 생성 -> salt 역할

pbkdf2 인수로 순서대로 비밀번호, salt, 반복 횟수, 출력 바이트, 알고리즘

반복 횟수를 조정해 암호화하는 데 1초 정도 걸리게 맞추는 것이 권장됨

 

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

Key가 사용됨 -> 훔쳐질 가능성이 높음

암호화할 때와 복호화 할 때 같은 Key를 사용해야 함 ( 관리를 철저하게 하자 ) (KMS 현업에서 사용)

crypto.createCipheriv(알고리즘, , iv): 암호화 알고리즘과 키, 초기화벡터를 넣어줍니다.

암호화 알고리즘은 aes-256-cbc를 사용했습니다. 다른 알고리즘을 사용해도 됩니다.

사용 가능한 알고리즘 목록은 crypto.getCiphers()를 하면 볼 수 있습니다.

키는 32바이트, 초기화벡터(iv)16바이트로 고정입니다.

 

cipher.update(문자열, 인코딩, 출력 인코딩): 암호화할 대상과 대상의 인코딩, 출력 결과물의 인코딩을 넣어줍니다.

보통 문자열은 utf8 인코딩을, 암호는 base64를 많이 사용합니다.

 

cipher.final(출력 인코딩): 출력 결과물의 인코딩을 넣어주면 암호화가 완료됩니다.

 

crypto.createDecipheriv(알고리즘, , iv): 복호화할 때 사용합니다. 암호화할 때 사용했던 알고리즘과 키, iv를 그대로 넣어주어야 합니다.

 

decipher.update(문자열, 인코딩, 출력 인코딩): 암호화된 문장, 그 문장의 인코딩, 복호화할 인코딩을 넣어줍니다.

createCipherupdate()에서 utf8, base64 순으로 넣었다면 createDecipherupdate()에서는 base64, utf8 순으로 넣으면 됩니다.

 

decipher.final(출력 인코딩): 복호화 결과물의 인코딩을 넣어줍니다.

 

Util

 

각종 편의 기능을 모아둔 모듈 -> 한번 만들면 그대로 가야합니다 (바꾸기 힘듬)

 deprecated promisify가 자주 쓰입니다.

deprected로 잘못 만들었다고 또는 수정되었다고 오류로 알려 줌 -> 나중에 버젼이 올라갈 때 없어질 수 있음

java가 call back -> promise로 넘어가고 있는데 node에서는 아직 call back이 많음 

그래서 promisift를 call back 함수를 감싸주면 promise로 바뀜

util.deprecate: 함수가 deprecated 처리되었음을 알려줍니다.

첫 번째 인자로 넣은 함수를 사용했을 때 경고 메시지가 출력됩니다.

두 번째 인자로 경고 메시지 내용을 넣으면 됩니다. 함수가 조만간 사라지거나 변경될 때 알려줄 수 있어 유용합니다.

 

util.promisify: 콜백 패턴을 프로미스 패턴으로 바꿔줍니다.

바꿀 함수를 인자로 제공하면 됩니다. 이렇게 바꾸어두면 async/await 패턴까지 사용할 수 있어 좋습니다.

콜백이 (error, data) => {} 형식이어야 합니다. 

 

3.5.5.1절의 randomBytes와 비교해보세요. 프로미스를 콜백으로 바꾸는 util.callbackify도 있지만 자주 사용되지는 않습니다.

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

child_process, 기타 모듈  (0) 2020.12.11
Worker_threads (멀티 스레드)  (0) 2020.12.10
OS, path, url 모듈  (0) 2020.12.07
노드 내장 알아보기 #2  (0) 2020.12.04
노드 내장 알아보기 #1  (0) 2020.12.03