ARCHIVE/DB

Authentication / Authorization ( 인증/인가 )

man_on 2021. 11. 19. 16:52
반응형

 

 

유저 비밀번호 암호화

 

 

🤷🏻‍♀️ 비밀번호는 어떻게 관리해야 할까?

 : DB에 저장 시 개인정보를 해싱하여 복원할 수 없도록 암호화해서 저장 해야 한다.

   ( DB가 해킹을 당해도 pw 그대로 노출되지 않으며, 내부 인력도 알 수 없도록 하기 위해서)

 

 

 

🤷🏻‍♀️ 암호화는 어떻게 할까?

 

   ✔️ 해쉬 함수?

   :  input 넣으면 output이 빠르게 나오는 함수이다. (같은 input > 같은 output / 다른 input > 다른 output )

      ( MD5, SHA-1 : 보안에 취약) , SHA-256 등이 있다.

 

  ✔️ 단방향 해쉬 ?

   : 원본 메시지를 변환하여 암호화된 메시지인 digest 다이제스트를 생성한다.

     ( 원본을 알면 암호화된 메시지를 구하기는 쉽지만, 암호화된 메시지로는 원본 구하기 어렵다. )

   

     예시)

더보기
더보기

"test password"를 hash256 해쉬함수를 사용하면

0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e

 

"test password2"를 hash256 해쉬 함수를 사용하면 d34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb

    하지만, 해쉬함수도 취약점이 있다.

     Rainbow table attack - 미리 해쉬값들을 계산해 놓은 테이블을 Rainbow table이라고 한다.

 

   원래 해쉬함수는 패스워드 저장용이 아니라, 짧은 시간에 데이터를 검색하기 위해 설계된 것이다.

   이러한 속성을 이용하여 빠른속도로 임의의 문자열의 digest와 해킹할 대상의 digest를 비교할 수 있다.

   ( 1초당 56억개 정도 ) 

 

 

 

 

 

단방향 해쉬의 취약점 보완

 

  ✔️ Salting

        :  입력한 비밀번호 + 임의생성 문자열(salt) = hash값

           ( 비교를 위해서 hast값과 salt값을 같이 저장한다. )

salt값은 랜덤으로 계속 바뀐다.

 

 

  ✔️ Key Stretching

      : 단방향 hash값 계산 후, 그 값을 또 hash hash hash...반복한다.

       ( 무작위 대입을 통해 hash값을 계산시간을 대폭 늘리기 위해서, salting 여러번 반복하여 원본값 유추를 어렵게 만드는 것)

 

 

  > key stretching을 적용하여 동일한 장비에서 1초에 5번정도만 비교할 수 있게 한다.

     완벽한 암호화는 없다. 암호화 기술의 발달은 뚫리는 시간을 무한정으로 늘리는 방향으로 발달하는 것이다.

     그러니까 비밀번호 자주바꿔,,

 

 

 

 

bcrypt

 : salting & key stretching library

   비밀번호를 단방향 암호화 하기 위해 만들어진 해쉬함수이다.

   결과값에 salt와 hash, 반복횟수를 같이 보관하기때문에 DB설계를 복잡하게 할 필요가 없다.

 

 

 

https://www.npmjs.com/package/bcryptjs

 

bcryptjs

Optimized bcrypt in plain JavaScript with zero dependencies. Compatible to 'bcrypt'.

www.npmjs.com

 

bcryptjs 써보기

 

암화화 진행과정

 

npm install bcryptjs --save-dev

Async ver. 

 

 


 

 

JWT (Json Web Tokens)

  : access token을 생성하는 방법중 하나이다.

    유저 정보를 담은 JSON 데이터를 암호화해서 클라이언트와 서버간에 주고받는 것이다.

 

유저가 로그인 성공 후에는 access token이라는 암호화된 유저정보를 첨부해서 req 보낸다.

//유저 로그인
POST /auth HTTP/1.1
Host: localhost:5000
Content-Type: application/json

{
    "username": "joe",
    "password": "pass"
}
//access token
HTTP/1.1 200 OK
Content-Type: application/json

{
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNDQ0OTE3NjQwLCJuYmYiOjE0NDQ5MTc2NDAsImV4cCI6MTQ0NDkxNzk0MH0.KPmI6WSjRjlpzecPvs3q_T3cJQvAgJvaQAPtk1abC_E"
}

서버에서는 token을 복호화해서 해당 유저의 정보를 얻게된다.

{
    user_id = 1 
}

이런 절차는 해당 유저가 매번 로그인을 해도 되지 않도록 하는 것이다.

 

 

 

반응형

'ARCHIVE > DB' 카테고리의 다른 글

[DB] Prisma 기초  (0) 2021.10.10
[DB] Prisma  (0) 2021.10.10
[DB] ORM  (0) 2021.09.16
[DB] C.R.U.D  (0) 2021.09.16
[DB] MySQL  (0) 2021.09.15