본문 바로가기

Spring

스프링 암호화

728x90

[

ShaPasswordEncoder를 상속하고 구현한 클래스와 인터페이스의 전체 모습입니다. 

필요한 메소드 외에는 작성하지 않았습니다.

 

ShaPasswordEncoder는 상위에 있는 클래스와 인터페이스의 메소드 모두 사용할 수 있습니다. 

옛날에는 최상위 인터페이스인 PasswordEncoder의 encodePassword메소드를 사용했지만

지금은 deprecated(없어짐) 상태입니다. 

 

사용법을 먼저 코드로 알아본 뒤에

salt란 무엇인지, sha256이란 무엇인지에 대해서 공부하고

어떤 방식으로 내가 적은 PW가 바뀌는 지에 대해서 

총 3가지를 알아보겠습니다. 

 

먼저 코드를 확인하겠습니다.

코드는 niees님의 내용을 참고했습니다.

https://niees.tistory.com/16

 

05. spring security sha256 암호화 적용하기

spring security 에서는 기본적으로 아래와 같은 암호화 모듈을 제공하고 있다. BaseDigestPasswordEncoder BasePasswordEncoder LdapShaPasswordEncoder Md4PasswordEncoder Md5PasswordEncoder MessageDigestPas..

niees.tistory.com

 


 

먼저 ShaEncoder라는 클래스를 

개발자가 이름을 ShaEncoder라고 명칭하여 작성합니다. 다른 이름으로 해도 됩니다.

라인 4에서 ShaPasswordEncoder를 import한게 보이시죠?

ShaPasswordEncoder 클래스가 상속한 클래스 중 encodePassword 메소드를 사용합니다.

encodePassword는 바로 상위 클래스인 MessageDigestPasswordEncoder 클래스에 있습니다.

옛날에는 최상위 인터페이스인 PasswordEncoder에 존재했지만 현재는 deprecated(없어짐)상태입니다.

 

아무튼 encodePassword 메소드의 파라미터 값으로 

암호화할 패스워드, salt값 이 두가지를 넣습니다. 

 

암호화할 패스워드는 알겠는데.. salt값은 도대체 뭐야.. 할 수 있습니다. 

 

salt에 대해서 알아보겠습니다. 

 


[Salt란]

암호학에서 사용하는 방법 중 하나인데요. 

암호를 해시 처리하는 단방향 함수의 .... (뭐라는건지 모르겠습니다)

 

해시 처리에 대해서 먼저 알아보겠습니다. 

 

 

해시란 key와 value 값이 존재합니다. key에 따라서 value를 주어주는건데요. 좀 더 이해하기 쉬운 표를 살펴보겠습니다.

 

우리는 ABC라고 적었지만 

암호화를 시킨다면 ABC에 각 알파벳에 대응하는 값을 다르게 저장할 수 있습니다. 

 

Key를 A로 준다면 

Value는 D로 저장한다. 

이것이 바로 해싱. 해시 테이블 입니다. 

조금은 이해가 갑니다. 조금 더 복잡하게 암호화를 시킨다면 다음 표와 같이 만들 수 있습니다. 

 

 

 

 

[Sha256이란]

Key를 D로 줬을 때 

Value는 또다른 해시테이블을 확인하여 Value를 가져오도록 합니다.

해시테이블 안에 해시테이블이 거듭하여 존재하는겁니다. 

정말 복잡해 보입니다. 

이러한 복잡한 암호화를 만든 기관이 NSA(미국국가안보국)입니다. 

NSA에서는 이 암호화패턴을 SHA라고 부르기로 합니다. 

옛날 버전은 SHA1 이였고 현재는 SHA2 버전입니다.

SHA2 버전 중 하나인 SHA256 버전이 있습니다. 

SHA256 버전은 어떤 패턴으로 암호화를 만드는지 살펴보겠습니다. 

 

사용자가 password123 이라고 비밀번호를 저장하려고 합니다. 

이 비밀번호를 암호화 시킬건데요. 

password123이라고만 해시테이블을 돌려서 해시 값을 얻을 수도 있습니다.

하지만 조금 더 두터운 암호화를 위해 랜덤값을 하나 추가합니다. 

 

password123 + ABC(랜덤값)

password123ABC가 되겠죠? 

그럼 각각 하나씩 해시테이블에 해싱값을 얻어옵니다. 이 값이 바로 SHA256 형식의 암호화된 결과입니다. 

 

그럼 이제 다시 코드표를 보고 이해해보도록 하겠습니다.


 

코드는 굉장히 쉽습니다.

원래의 메소드명은 encodePassword입니다. 

여기선 임의로 메소드명을 변경한겁니다. 

이해가 안간다면 다음 그림을 다시 보고 이해해보시길 바랍니다.

encodePassword의 파라미터값은 두개입니다.

다음 그림을 보고 설명하겠습니다.

 

 

 

Salt와 MessageDigest 

두 가지를 다시 한번 보고 가겠습니다.

 

먼저

Salt는 한마디로 해싱테이블에 해싱할 값을 뭘 더할래? 라는 것과 마찬가지입니다. 

사용자가 hi123! 이라고 비밀번호를 저장한다고 예를 들때 

hi123! 에 대응하는 해싱값이 나올 겁니다.

거기에 더 나아가 Salt를 추가한다면 해싱값이 더 많아지겠죠?

 

hi123! + salt값 = 암호화된 비밀번호

 

salt값으로 ABC를 주어도 좋고 123을 주어도 좋고

개인 email 주소를 주어도 좋고 아무렴 좋습니다. 

 

다음 코드를 보고 salt에 대해 이해를 마무리 지어 보겠습니다.

여기선 salt값을 email로 준게 보이나요? 

아무렴 상관 없습니다. 

 


[MessageDigest]

메소드의 설명을 보면

"패스워드를 인코딩 해준다. MessageDigest를 사용해서.. " 

라고 합니다. MessageDigest란 내가 보낸 message를 소화한다는 의미일까요?

어떤 방면으로 보면 맞다고도 할 수 있습니다. 

MessageDigest는 한마디로 암호화한 결과입니다. 

 

내가 FOX를 입력했을 때 암호(cryptography) 해시 테이블을 거쳐 

Fox가 소화되면 암호화된 비밀번호가 생성됩니다. 

 

한마디로 해시테이블을 거쳐 나온 결과값을 digest라고 생각하면 될 것 같습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참고 사이트 

https://melonpeach.tistory.com/49