코드스테이츠_국비교육/[Section4]

61.02_[인증/보안] 기초_해싱_22.11.17

생각없이 해도 생각보다 좋다. 2022. 11. 17. 22:06

>인증/보안 과정

1. No Authentication (인증)

: 인증 과정이 없다면 누구나 모든 정보에 접근이 가능함.

2. Authentication (Plaintext)

: 누구나 모든 정보에 접근이 가능한 것을 막는 것이 목표

: 패스워드의 개념이 생김

: 패스워드를 입력하고 패스워드를 확인하여 해당 패스워드를 가진 유저에게만 정보에 접근이 가능하도록 함.

: 하지만 패스워드를 중간에 가로챈다면 그대로 악용될 수 있음.

3. Encrytion (암호화)

: 때문에 패스워드를 암호화할 필요가 생김.

: 패스워드를 암호화하는 알고리즘은 수 없이 많고, 그 중 하나로 Hashing이 있음.

4. Authentication (Hashing)

: 패스워드를 처음 생성하면 Hashing 을 통해 다른 문자열로 DB에 저장함.

: 이후 패스워드를 입력하면 Hashing 을 통해 입력값에 따른 출력값(해싱값)으로 변환하고 DB에서 확인을 함.

: DB에서 해당 해싱값이 확인되면 요청에 따른 응답을 제공함.

 

>해싱

: 입력받은 데이터를 고정된 길이의 데이터로 변환할 때, 이전 데이터를 알아볼 수 없게 만드는 것

: 특정 문자열을 임의의 연산을 통해서 다른 문자열로 변환하는 것

 

>Hashing 조건

1. 모든 값에 대해 해시 값을 계산하는데 오래걸리지 않아야 한다.
2. 최대한 같은 해시 값이 나오지 않도록 피하고 모든 값이 고유한 해시값을 갖도록 알고리즘을 설정해야한다. (이를 위한 알고리즘이 많이 배포되어있다.)
3. 기존 값이 작은 단위의 변경을 통해 다른 값이 된다면, 해시값 또한 완전히 다른 해시 값이 되어야한다.

 

>해싱 알고리즘

: SHA-1/ SHA-256/ SHA512 등

: input 과 output이 항상 동일한 순수 함수

: 해싱된 값(다이제스트)은 사실상 복호화가 불가능함.

: 하지만 레인보우 테이블을 만들어서 어느정도 해결이된다.

//레인보우 테이블 : 문자들의 해싱값을 파악하여 문자열과 해싱값을 매칭시켜놓은 테이블. 완벽하진 않지만 자주 쓰이는 문자열에 대해서는 복호화가 가능

 

>Salt

: 암호화해야 하는 값에 어떤 '별도의 값'을 추가하여 결과를 변형하는 것
: 기본적인 Hasing을 보완하기 위한 수단 (레인보우 테이블 방지)
: 기본적인 Hasing은 만약 해시 값을 원래 값으로 decoding 할 수 있는 테이블을 만든다면 보안에 취약해질 수 있음.

>Salt 주의점

1. 유저 및 패스워드 정보 별로 유일한 값을 가져야 한다.
: 따라서 사용자 계정을 생성할 때나 비밀번호를 변경한다면 새로운 임의의 고유 Salt값을 할당해서 Hasing 할 때 사용해야한다.
2. Salt는 절대 재사용하면 안된다.
3. Salt는 DB의 유저 테이블에 같이 저장되어야 한다.