공부/Security

암호화 Encode / Encrypt / Hash

kkkkkdddddhhhhh 2023. 12. 17. 22:28

최근 스프링 시큐리티 강의를 들으면서 사용자의 비밀번호를 암호화 할 때 Hash 암호화 방식을 사용해야하는지 배웠다. 

간단하고 짧게 복습하자는 의미에서 글을 남긴다.

 

암호화방식에는 크게 3가지가 존재한다. 

 

1. Encode

 

2. Encrypt

 

3. Hash

 


1. Encode

대표적으로 Base64를 통해 암호화 하는 방식.

 

공개적인 암호화 방식으로 암호화를 진행하므로 어떠한 알고리즘을 사용했는지만 알 수 있다면 쉽게 복호화가 가능하다.

그때문인지 비밀번호라던가 유출에 크리티컬한 정보는 Encode 방식으로 암호화 하지않고 주로 이미지, 동영상 업로드에 사용된다. 

 

2. Encrypt

Encode방식에서 조금 더 진화된 형태로 Key가 들어간다. 

암호화된 데이터를 복호화할때 Key가 없다면 복호화가 불가능. 

 

Key의 유출만 되지않는다면 안전한 암호화 방식으로 초기 웹 어플리케이션 데이터 암호화에 많이 사용됬다고한다. 

 

하지만 이역시 Key가 유출되면 복호화가 쉽고, Server 개발자, DBA등 내부에서 해킹의 우려가 있어 최근 웹 어플리케이션의 비밀번호 암호화에 사용되지않는다.

 

 

앞서 적은 2가지 방식의 공통점은 가역적이라는것. 

암호화한뒤 복호화 할 수 있는 방식이 어떻게든 존재하기에 유출의 우려가 크다.

 

3. Hash

해쉬 암호화는 해쉬 알고리즘으로 단방향 알고리즘으로 복호화가 되지않는다. 

비밀번호가 한번 암호화되면 사용자가 원래 입력했던 비밀번호를 알 수 없다는 이야기

 

이 방식을 사용하면 어떻게 서버에서 사용자가 입력한 비밀번호가 DB저장된 비밀번호인지 알 수 있는걸까? 

 

방식은 간단하다. 

 

사용자가 '1234' 라는 비밀번호를 입력해 회원가입을한다.

 

-> 서버에서 '1234' 라는 문자값을 가지고 해쉬 암호화를 진행한다. DB에는 '1be168ff837f043bde17c0314341c84271047b31' 라는 해쉬 암호화된 데이터만 남는다. 

 

-> 해당 사용자가 회원가입을 마치고 로그인 요청시 서버에서 사용자가 입력한 비밀번호 '1234'를 해쉬 암호화 한뒤,

 

->로그인 요청의 비밀번호 해쉬 밸류 와 DB에 해쉬 암호화하여 저장된 해쉬 밸류가 같다면 로그인 요청에 성공한다.

 

해쉬는 단방향 알고리즘으로 서버를 개발한 내부에서도 사용자의 비밀번호를 알 수 없으며, 외부 해킹에서도 역시 안전하다.

 

Spring Security 에서 제공해주는 PasswordEncoder Interface의 구현체들도 해쉬 암호화를 통해 암호화를 진행한다. 

 

1.  BcryptEncoder

2. ScryptEncoder

3. Argon2Encoder 

 

1 ~ 3 번으로 갈 수록 암호를 해킹하는데 어려워지지만 그에따른 우리의 웹 어플리케이션 성능부하가 커진다하여 개인 프로젝트에는 

BcryptEncoder 를 사용할 예정 

'공부 > Security' 카테고리의 다른 글

인증과 권한부여 [Authentication & Authrization]  (0) 2023.12.19
CORS & CSRF  (0) 2023.12.19