-
Node.js 교과서 - 암호화Node.js 2021. 9. 19. 01:47
crypto
다양한 방식의 암호화를 도와주는 모듈
비밀번호는 반드시 암호화 해야한다.
[ 단방향 암호화 ]
복호화 : 암호화된 문자열을 원래 문자열로 되돌려 놓는 것
단방향 암호화 : 복호화 할 수 없는 암호화 방식 => 주로 해시 기법 사용비밀번호는 단방향 암호화해야 한다.
처음 데이터베이스에 저장할때 암호화한 해쉬 번호를 저장하고,
동일한 알고리즘 방법으로 비밀번호를 해쉬 번호로 바꿔서 비교한다.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 등이 가능하다.
- update(문자열) : 변환할 문자열을 넣는다.
- digest(인코딩) : 인코딩할 알고리즘을 넣는다.
다른 문자열을 넣었을 때, 똑같은 변환값으로 바뀐다면 충돌이라 한다.
현재는 주로 pbkdf2 알고리즘을 사용하여 비밀번호를 암호화 한다.
pbkdf2 : 기존 문자열에 salt라고 불리는 문자열을 추가한 후 해시 알고리즘을 반복해서 적용하는 것.
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')); }); });
먼저 64바이트 길이의 문자열을 만들어서 salt를 만들어준다.
pbkdf2() 메서드에 비밀번호 , salt , 반복횟수 , 출력 바이트 , 해시 알고리즘을 인수로 넣는다.
반복 횟수란 sha512로 변환된 결괏값을 다시 sha512로 변환하는 횟수이다.
crypto.randomBytes와 crypto.pbkdf2 메서드는 내부적으로 스레드풀을 사용해 멀티 스레딩으로 동작한다.
[ 양방향 암호화 ]
암호화된 문자열을 복호화할 수 있다.
대칭형 암호화에서 암호를 복호화하려면 암호화할 때 사용한 키와 똑같은 키를 사용해야 한다.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);
암호화
- crypto.createCipheriv(알고리즘 , 키 , iv)
- cipher.update( 문자열 , 인코딩 , 출력 인코딩 )
- cipher.final( 출력 인코딩 )
복호화
- crypto.createDecipheriv( 알고리즘 , 키 , iv )
- decipher.update( 문자열 , 인코딩 , 출력 인코딩 )
- decipher.final( 출력 인코딩)
'Node.js' 카테고리의 다른 글
Node.js 교과서 - 파일 시스템 (0) 2021.09.19 Node.js 교과서 - worker_threads (0) 2021.09.19 Node.js 교과서 - path , url , querystring (0) 2021.09.19 Node.js 교과서 - process (0) 2021.09.19 이벤트 루프 , 콜 스택, 태스크 큐 (0) 2021.09.18