카테고리 없음

Crypto를 이용한 암호화 설정하기

JuChan 2022. 3. 2. 17:45

1. Hash(단방향 암호화,salt)

2. buffer

3. 인코딩, 디코딩

4. Crypto를 이용한 암호화

4. jwt(Json Web Token)


1. Hash

  • 해시 함수는 임의의 길이의 데이터를 고정된 길이의 데이터로 반환시켜주는 함수이다
  • 입력값의 길이가 달라도 출력값은 언제나 고정된 길이로 반환한다.
  • 암호학에서 사용할 수 있다. (암호학적 해시, 비암호학적 해시)
  • 해시는 절때 복호화가 불가능해서 해시값을 가지고 원본값으로 역산할 수 없다. (단방향 암호화)

 

대표적인 암호학 해시 함수로는 MD5(Message-Digest algorithm 5), SHA(Secure Hash Algorithm)이 있다.

 

우리는 SHA 암호학 해시 함수를 이용할 것이다.

 

SHA(Secure Hash Algorithm)

  • 미국 국가안보국(NSA)이 설계했으며 미국 국가 표준으로 지정되어있다.
  • SHA-0 : 최초희 함수는 SHA라고 불리고 나중에 설계된 함수들과 구별하기 위해 SHA-0로 통칭했다
  • SHA-1 : SHA-0을 변형한 함수이다.
  • SHA-2 : SHA-1을 변형하여 SHA-224,SHA-256,SHA-384,SHA-512의 4가지 변형 함수가 나왔고 이들을 통칭 SHA-2라고 한다.
  • 현재는 SHA-256 알고리즘을 사용하기를 권장한다. 왜냐하면 충돌이 발생할 수 있기 때문

 

 

솔팅(Salting)

  • 말 그대로 소금을 더한다는 의미이다.
  • 실제 암호화된 값에 소금이라는 변수를 넣어줌으로써 새로운 서버 관리자만 알 수 있는 암호값을 만들어준다.

 

2. buffer

버퍼는 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역이다. 버퍼링이란 버퍼를 활용하는 방식 또는 버퍼를 채우는 동작을 말한다.

 

 

3. 인코딩, 디코딩

인코딩

  • 문자(문자열)을 바이트 형식으로 전환
  • 컴퓨터에서 인코딩은 동영상이나 문자 인코딩뿐 아니라 사람이 인지할 수 있는 형태의 데이터를 약속된 규칙에 의해 컴퓨터가 사용하는 0과 1로 변환하는 과정을 통틀어 말한다. 
  • 즉 사람이 인지하지 못하고 컴퓨터가 이해할 수 있도록 바꿔주는 것을 의미한다.
  • 그 예로 ASCII, URL인코딩, HTML인코딩, Base64인코딩 등이 존재한다.

 

디코딩

  • 디코딩은 인코딩의 반대로서 사람이 이해할 수 있도록 바꿔주는 것을 의미한다.
  • 바이트형식을 문자(문자열)로 변환하는 것이다.

 

 

4. Crypto를 이용한 암호화

우리는 지금까지 프로젝트를 진행하면서 로그인과 회원가입 기능을 넣었습니다.

 

세션과 데이터베이스를 통해서 비밀번호를 저장했는데 이런식으로 저장하면 나중에 해커로부터 정보를 빼돌릴 위험이 매우 높기 때문에 우리는 비밀번호를 암호화할 의무가 있기에 Crypto를 이용해서 암호화를 진행해보겠습니다.

 

 

Crypto

 

: Node.js 내장 모듈이며, 여러 해시 함수를 통한 암호화 기능을 제공해준다.

 

  • createHash( ) : 사용할 알고리즘
  • update( ) : 암호화할 비밀번호
  • digest( ) : 인코딩 방식

 

먼저 crypto 모듈을 끄집어내보도록 하자. 

const crypto = require('crypto')

 

우리는 이제 비밀번호를 설정하고 그 값을  암호학 해시함수(sha256)를 이용해서 암호화를 진행할 것이다.

 

const name = 'jang'
const sha256 = crypto.createHash('sha256').update(name).digest('base16') 
const sha256_2 = crypto.createHash('sha256').update(name).digest('hex')

 

 

 

 

  1. 먼저 name 변수를 지정해서 jang이라는 값을 설정해준다
  2. 우리는 name을 암호화할 것이다.
  3. 위에 함수를 설명한대로 createHash( )에 우리가 사용할 해시함수 알고리즘인 'sha256'을 넣어주고
  4. update( ) 에 암호화할 변수명을 넣어준다.
  5. 마지막 digest( )에는 인코딩 방식을 넣어주는데 우리는 'base16' 과 'hex'를 넣었다. 둘은 같은 16진수를 사용하고 있고 차이점은... 없다?
  6. 이렇게 설정하고 console.log( )를 치면 jang이라는 값이 암호화된 것을 볼 수 있을 것이다.

 

 

5. JWT (Json Web Token)

JWT란 Json Web Token의 약자로 Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다.

 

JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달한다. 우리는 session을 통해서 회원정보를 주고받았지만 이제 JWT를 통해서  회원 인증이나 정보 전달을 이용할 수 있다.

5-1 JWT 구조

JWT는 Header, Payload, Signature의 3부분으로 이루어져 있다. 이 3부분은 Json 형태로 각각 'Base64' 로 인코딩되어 표현된다. 또한 각각의 부분을 이어주기 위해 ' . ' 구분자를 사용하여 구분해준다. 추가로 Base64는 암호화된 문자열이 아니고, 같은 문자열에 대해 항상 같은 인코딩 문자열을 반환한다.

 

1 ) Header ( 헤더 )

토큰의 헤더는 typalg 두 가지 정보로 구성된다. alg는 헤더를 암호화하는 것이 아닌, signature를 해싱하기 위한 알고리즘을 지정하는 것이다.

 

typ : 토큰의 타입을 지정alg : 알고리즘 방식을 지정하여 Signature 및 토큰 검증에 사용 ex) SHA256

 

 

2) Payload (페이로드) 토큰의 페이로드에는 토큰에서 사용할 저보의 조각들인 클레임(Claim)이 담겨 있다.

 

3) Signature (서명)

서명(Signature)은 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다. 서명(Signature)은 위에서 만든 헤더(Header)와 페이로드(Payload)의 값을 각각 BASE64로 인코딩하고, 인코딩한 값을 Salt키를 이용해 헤더(Header)에서 정의한 알고리즘으로 해싱을 하고, 이 값을 다시 BASE64로 인코딩하여 생성한다.


 

 

Header, Payload, Signature를 이용해 생성되는 JWT는 최종적으로 다음의 형태를 띠고 있다. 각각의 부분들 모두 인코딩 된 형태로 들어가게 되며 ' . ' 을 구분자로 해서 Header, Payload, Signature를 구분한다.