스프링 비밀번호 암호화/복호화?
반응형

1. 암호에 대한 기본 설명

 

스프링에서는 passwordEncoder로 

DB에 비밀번호를 저장할때 관리자도 비밀번호를 알 수 없도록 비밀번호 암호화를 지원한다.

해시함수를 이용해서 암호화를 하게 되는데

 

암호화 된 비밀번호는 사람이 알아보기 어려운 형태를 띤다.

 

 

예를 들어 비밀번호가 1234 라면 암호화되었을때는  '$2$17a$L3kE8oeG...' 

 

 

암호학의 어떠한 수학 공식을 이용해서 사람이 알아보기 힘들게 저장 된다.

 

암호학에 관련된 영역까지는 모르니 넘어가고 

 

 

 

이렇게 암호화 된 비밀번호와 내가 로그인 할때 입력한 비밀번호는 당연히 다를 수 밖에 없는데 어떻게 로그인이 되는 것일까?

 

아! 나는 바로 생각해낼 수 있었다.

 

 

옛날에 군대에서 파일을 암호화해서 송/수신하고

 

송수신 된 파일을 보기 위해서 복호화 프로그램 툴로

 

복호화를 해서 파일을 봤던 기억이 났다.

 

 

그렇다면 내가 백엔드 단에서 DB에 있는 비밀번호를 불러와서 그걸 복호화 시키고 내가 입력한 비밀번호와 대조시켜보면 되겠구나! 생각했다.

그렇다면 복호화 시키는 코딩이 있을테니 검색해보자!

 

어?

 

그런데 아무리 검색을 해도 암호화 된 비밀번호를 복호화 할 수 있는 방법이 나와있지 않았다.

 

복호화가 불가능 하다는 답변만이 되돌아 올 뿐이었다.

 

 

 

 

그렇다면!

 

 

나는 또 바로 생각해낼 수 있었다.

 

복호화는 불가능하니까

 

DB에 저장했던 방법 그대로

 

내가 입력한 비밀번호를 암호화 한 뒤에

 

DB에 저장된 암호화된 형태의 비밀번호와 대조하면 맞겠네!!

 

같은 비밀번호라면 같은 암호화 수학 공식을 사용해서 암호화 할테니 

 

그 형태가 똑같을 수 밖에 없지!!

 

 

어?

 

로그인이 안되어 백단에서 로그를 찍어보니 똑같은 String 문자열이 들어갔는데

 

암호화 된 결과는 계속 달라져서 대조가 불가능 했다.

 

equals()를 사용한 문자열 비교함수를 쓰지 못한다는 것을 알게 되었다.

if(내가 입력한 암호화 된 비밀번호.equals(DB에서 불러온 암호화 된 비밀번호){
	로그인 성공!
}else{
	로그인 실패..
}

 

 

 

스프링의 보안을 너무 우습게 본 것이다..

 

 

그리하여 검색을 해보니 salt니 뭐니.. 여러 기술들로 암호화 할때마다 매번 값이 달라지는 것을 알 수 있었다.

 

그리고 비밀번호가 맞는지 지원하는 메서드가 따로 있다는 것을 알게 되었다.

 

그것은 바로..matches 였다.

 

passwordEncoder.matches(내가 입력한 비밀번호, DB에서 불러온 암호화 된 비밀번호);

 

이 메서드를 쓰니 드디어 로그인이 되었다.

 

복호화가 불가능하다고 했는데... 이건 어떻게 비밀번호를 대조할 수 있는 걸까?

 

어떤 개발자가 이 matches를 파고든 기록이 있어서 링크를 걸어본다. 상당히 재밌게 봤다.

 

https://codingdog.tistory.com/entry/bcrypt%EB%8A%94-salt%EA%B0%80-%EB%A7%A4%EB%B2%88-%EB%8B%AC%EB%9D%BC%EC%A7%80%EB%8A%94%EB%8D%B0-match%EB%A5%BC-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9E%98-%EC%8B%9C%ED%82%AC%EA%B9%8C%EC%9A%94

반응형