AES-256 암/복호화 알고리즘

개요

유저가 회원가입할 때 입력한 정보를 DB에 저장할 때 아무 생각 없이 비밀번호 그대로 저장하면 될 줄 알았다.

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

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

AES-256

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

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

양방향 해싱 알고리즘

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

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

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

암호화

plain text => plain bytes => encrypt => encrypted bites => encrypted base64 text

복호화

암호화 과정을 반대로 수행한다.


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

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

두번째로 서버에서 지정한 Salt 값 이다.

Salt

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

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

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

구현

AES-256 모듈을 설치한다.

npm i aes256

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

node-aes1

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

node-aes2
node-aes3

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

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

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

node-aes4
node-aes5

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

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

Reference

YUNSU BAE

YUNSU BAE

주니어 웹 개발자 배윤수 입니다!

예술의 영역을 동경하고 있어요. 🧑‍🎨