ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [nodejs] 암호화 - crypto 모듈
    Web 2019. 5. 31. 03:28

    사전지식

    - 암호학

    - 문자 인코딩 개념(base64, hex, ascii, utf8)

     

    *암호함수는 비트열이 담긴 버퍼를 생성하는 것이기 때문에

    이것을 어떤방식으로 읽을지(문자 인코딩방식)를 지정해야한다.

     

     

    nodejs crypto 모듈 레퍼런스

    https://nodejs.org/api/crypto.html

     


    nodejs 내장모듈임

     

    crypto패키지 에서 제공되는 암호화 기법

    -대칭키/비대칭키 암호

    -Hash

    -DH(Diffie Hellman) 

    -ECDH

    -Hmac

    -Sign

    -Verify

    -Certificate

     

     

     


    자주쓰이는 함수

     

     

    • buffer.toString()
    buffer.toString(인코딩)

     

     

    • randomBytes() : 
    randomBytes(바이트수, callback(error, buffer){ });

     

     

     

     

    • getCiphers() : 모듈이 지원하는 암호알고리즘 목록 리턴
    console.log(crypto.getCiphers()) // [ 'aes-128-cbc',  'aes-128-cbc-hmac-sha1', ... ]

     

     

     

     

    update(평문, [인풋인코딩], [아웃풋인코딩])   

     

     

    digest(인코딩)

     

     

     

     

     


    Hash : Hash 클래스 


    Hash 클래스의 메소드

    update(data) : data 해싱

    digest(encoding) : encoding 방식에 따라 결과값을 가져올 수 있음

     

    *비트열을 생성하는것이기 때문에 문자인코딩 필요

     

    • createHash(해쉬알고리즘) 
    let hash = crypto.createHash("sha256"); 	//Hash 객체 반환
    hash = hash.update(평문);	                 //평문데이터 업데이트
    const digest = hash.digest("base64");		//다이제스트(해시값) 생성 및 인코딩

     

     

     

     

     

    • pbkdf2() : 솔트 + 키스트레칭(해쉬반복) 
    crypto.pbkdf2(평문, salt값, 반복횟수, 키길이, 해시알고리즘, callback(error, key){ })

    해시알고리즘은 빠르므로 수행시간이 최소 0.1초 이상 걸리도록 반복횟수 설정

    key 또한 buffer 형식이므로 인코딩필요

    콜백있으니 이건 비동기처리다

     

    동기는

    let keyBuf = crypto.pbkdf2Sync(평문, 솔트, 반복횟수,키길이, 해시알고리즘)

    리턴값은 key buffer

     

     

    해쉬는 단방향이므로 복호화 함수는 존재하지 않음

     

    지원하는 해쉬함수

     

     


    대칭키 암호화 


    대칭키방식은 키를 클라이언트와 공유해야하기 때문에 웹에서는 잘 사용하기 힘듬

     

     

    암호화

    const cipher = createCipher(대칭키알고리즘, 키값);  //Ciphper 객체반환
    let cipherText = cipher.update(평문, 입력값 인코딩방식, 출력값 인코딩방식);    //암호화적용
    cipherText += cipher.final(출력인코딩방식);

     

    final(encoding) 

    마지막 블록만 인코딩. 평문의 길이가 길면 에러발생

     

     

     

    복호화

    const decipher = createDeCipher(대칭키알고리즘, 키값);  //Decipher 객체반환
    let plainText = decipher.update(암호문, 출력할인코딩방식, 입력값인코딩방식);     //buffer 형식
    plainText += decipher.final(출력인코딩방식);

     

     

     

     


    Hmac


     

    const hmac = crypto.createHmac(해시알고리즘, 암호화키);
    const cipherText hmac.update(평문).digest(출력인코딩방식);

     

     

    'Web' 카테고리의 다른 글

    [Error] return undefined  (0) 2019.11.21
    클라이언트에서 서버로 데이터 전송(form/ajax-xml, fetch/WebSocket)  (0) 2019.05.29
    사용자 인증(로그인) 방식  (0) 2019.05.27
    [nodejs] express 사용하기  (0) 2019.05.25
    [Web] quick nodejs  (0) 2019.05.25
Designed by Tistory.