[Web] 사용자 비밀번호 암/복호화 알고리즘

Yalstrax·2021년 9월 5일
1

Back End

목록 보기
3/22
post-thumbnail

개요

첫번째 프로젝트를 진행하면서, 유저가 회원가입할 때 입력한 정보를 DB에 저장할 때 아무 생각 없이 비밀번호 그대로 저장하면 될 줄 알았습니다.

그러나 생각을 해보니, 서버의 데이터베이스가 털려버리거나, 백엔드 개발자가 악의를 품고 그 정보들을 공개해버릴 수 있겠다...는 위험한 생각이 들었습니다.

그렇기 때문에, 암호화된 비밀번호를 DB에 등록해야했습니다. 다양한 비밀번호 해싱 알고리즘이 있었지만, AES 256 알고리즘을 사용했습니다.

AES-256

AES는 Advanced Encryption Standart 의 약자입니다. 고급 암호화 표준인데, 암호화 및 복호화가 가능한 양방향 해싱 알고리즘입니다.

뒤에 붙은 숫자로는 128, 192, 256 등이 오는데, 이 숫자는 암호화 및 복호화에 사용되는 키의 길이를 의미합니다.

양방향 해싱 알고리즘

해싱 알고리즘은 양방향과 단방향이 존재합니다.

두 알고리즘의 차이는 양방향 해싱 알고리즘은 암호화된 값을 다시 암호화 전으로 돌릴 수 있는 복호화가 가능하고, 단방향 해싱 알고리즘은 복호화가 불가능하며, 오직 암호화만 가능합니다.

암호화 및 복호화는 다음과 같은 과정으로 이루어집니다.

  • 암호화
    plain text => plain bytes => encrypt => encrypted bites => encrypted base64 text

  • 복호화

    • 암호화 과정을 반대로 수행합니다.

AES-256 해싱 알고리즘은 양방향 해싱 알고리즘이며, 이를 수행하기 위해 필요한 값들이 있습니다.

여러가지 필요한 값들이 있지만, 꼭 필요한 값 두가지가 있습니다.

먼저 사용자가 입력한 plain text 가 있습니다. 이는 실제로 사용자가 회원가입 인풋 태그에 입력한 비밀번호 스트링 값이 됩니다.

두번째로,

서버에서 지정한 Salt 값입니다.

Salt

Salt는 말 그대로, 입력받은 스트링 값에 소금을 치는 것입니다.

입력 받은 비밀번호를 그대로 해싱하는 것이 아니라, 서버에서 지정하여 유저는 알 수 없는 소금을 친 비밀번호를 해싱하는 개념입니다.

그렇기 때문에, 이 소금은 외부로 절대 유출되어선 안되며, 쉽게 연상할 수 있는 소금이 되어선 안됩니다.

짧은 2주 프로젝트를 위해 단방향 해싱보다 다소 간단할 수 있는 양방향 해싱을 사용했고, 시간이 더 많은 4주 프로젝트에선 단방향 해싱을 사용해볼 생각입니다.

구현

AES256 모듈을 설치합니다.

공식문서

npm i aes256

다음에도 재사용할 수 있으므로 암호화 / 복호화 함수를 만듭니다.

이제 클라이언트에서 서버로 회원가입 요청이 들어올 때, payload에 담긴 비밀번호 plain text를 해싱하여, 그 값을 DB에 저장합니다.

유저의 회원가입 요청이 성공하면, DB에는 암호화된 비밀번호가 저장되는 것을 확인할 수 있습니다.

유저가 로그인할 때, 유저가 입력한 plain text와 DB에 저장된 해싱된 비밀번호는 다를 수 밖에 없습니다.

양방향 해싱 알고리즘인 AES 256은 DB에 저장된 해싱된 비밀번호를 복호화하여 유저가 입력한 plain text와 비교합니다.

유저가 로그인할 때, 입력한 비밀번호와 DB에 저장된 비밀번호와 일치하는지 판단하기 위해, DB에 저장된 비밀번호를 복호화하여 비교할 수 있습니다.

다음 프로젝트 땐 단방향 해싱 알고리즘을 사용하여 더 보안성을 향상시켜보고 싶습니다.

profile
즐겁다면 그것만으로 만만세!

0개의 댓글