ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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( 출력 인코딩)

    댓글

Designed by Tistory.