Number: 8
Tags: 동현
유저의 원본정보를 관리자나 해커가 확인 할 수 없게 암호화 시키기 위함이다.
정보가 탈취 당하더라도 암호화 되어있기에 원본 정보를 알 수가 없다.
특정 암호키를 사용하여 사용자의 정보를 암호화 시킨다.
BCrypt
해시 함수를 사용해 비밀번호를 암호화Argon2
해시 함수를 사용해 비밀번호를 암호화PBKDF2
해시 함수를 사용해 비밀번호를 암호화SCrypt
해시 함수를 사용해 비밀번호를 암호화security에서 제공하는 암호 알고리즘들은 모두 해시 함수이다.
해시: 임의 값을 고정 길이로 변환하는 것
해시 함수: 입력 값을 산술 연산을 이용해 설정한 고정 길이로 변환 시켜주는 함수(해시를 만듬)
위의 코드에서 해쉬함수의 구성요소만 알면 누구든지 암호화된 값을 복호화 할 수 있다.
(원본에 123123을 더해준 뒤에 2진수로 변환)-암호화
(암호화된 값을 10진수로 변환 후에 123123을 빼준다.) -복호화
실제로 passwordEncode는 저렇게 쉬운 해쉬함수로 암호화 하지 않는다. 또한 위의 코드는 고정된 길이를 반환해주지 않는다.
Spring Security에서는 plaintext, sha, sha256, md4, md5 이렇게 5가지의 해쉬함수 생성 알고리즘을 제공한다.
가장 유명한 sha256 알고리즘을 간략하게 살펴보면
입력된 값은 256비트로 구성되며 64자리의 문자열을 반환한다. 어떤 값을 입력하더라고 64자리의 문자열을 반환한다. SHA256 알고리즘은 위에서 간단하게 만든 해쉬함수 처럼 복호화 할 수 없는 단방향 알고리즘이다.
사용자가 입력한 값을 복호화해서 사용하는 것이 아니라 암호화된 값을 사용한다. 사용자가 로그인시에 입력한 비밀번호를 SHA256을 통해서 암호화 시킨 후에 DB에 저장되어 있는 암호화된 비밀번호와 비교하여 일치하면 로그인 성공이고 일치하지 않으면 로그인 실패를 판단 할 수 있다.
SHA256을 사용하면 관리자가 사용자의 원본 정보를 확인하고 싶어도 확인이 불가능하다.
Spring Security는 여기서 임의로 특정 문자열을 추가하여 보안성을 증가시켰다. 같은 "비밀번호"를 입력하더라도 암호화 된 값이 다르도록 설계하였다.
서로 다른 회원의 비밀번호가 같더라도 DB에는 다르게 저장된다.
ex) "1234"(사용자가 입력한 값) + "11" 스프링 시큐리티가 임의로 붙인 값 → dfsafasdkfnaseklrhk1231
ex)" 1234"(사용자가 입력한 값) + "14" 스프링 시큐리티가 임의로 붙인 값 → fasiouqweruioqwe14144
매번 실행 할 때마다 "11","14"에 해당하는 값이 달라진다. 이를 Salt라고 표현한다.
회원가입시 사용자가 입력한 비밀번호와 로그인 할 때 입력한 비밀번호를 비교하기 위해서는 PasswordEncoder.java안의 matches 클래스를 사용한다.
passwordEncoding.matches(로그인시 입력한 비번, 회원가입시 입력한 비번) boolean값으로 반환된다.
matches가 암호키도 없이 회원가입 때 입력한 암호화된 비밀번호와 로그인시 입력한 비밀번호를 비교하는 알고리즘은 확인이 불가능하다.(알면 다 해킹하기 때문에...)