Back-End/백엔드 관련 정리

인증(1) - 단방향 해시 함수의 다이제스트

얄루몬 2022. 12. 5. 11:07

인증과 인가

로그인 = 인증, 인가

 

인증 = 내가 그에 대한 자격이 있는지를 확인(주체를 확인)

 

단방향 해시의 다이제스트

  • 해시
  • 해시값
  • 해시코드
  • 다이제스트 

-> 위의 네개는 모두 같은 말

 

해시를 사용하는 이유?

단방향 해시의 경우 고정된 크기를 가지고있어서 그것으로 변환되기 때문에 빠른검색에 유리하다.(원문이 매우 큰 수여도 이를 고정적 길이로 변환시켜줌) 

이 경우 원문의 손실이 있기 때문에 해시로 저장한 경우라면 원문으로 복귀 시킬 수 없다.(원문 손실이 이미 있기 때문) 

이런 경우 데이터베이스가 털려도 비밀번호는 원문으로 돌아갈 수 없기 때문에 안전하다.

 

단방향 해시 함수 vs 암호화 알고리즘

- 단방향 해시 함수의 경우엔 단방향이라서 복호화가 불가

- 암호화의 경우엔 암호화와 복호화 작업이 모두 가능

 

단방향 해시의 문제

- 입력값이 같다면 이에 대응하는 해시값 역시 같은 문제가 발생한다.

 

단방향 해시의 문제 발생 -> 해결 방안?

1. salt 

- 입력값이 같으면 메시지가 같은 경우는 salt를 다르게 주면 이 역시 보완이 가능하다.

 

2. 키 스트레칭 기법

- 비밀번호에 salt 작업을 하면 해시함수를 돌려서 해시를 만들고 다시 해시 함수를 돌리는 것(해시 함수를 여러번 돌리는 것..)

입력한 비밀번호 다이제스트 생성 -> 생성 다이제스트로 다이제스트(해시)를 다시 생성(여기를 천번~~넘게 돌림, 이때 중요한 것은 여기를 몇번 돌렸는지를 모르게 하는 것..) -> 결과적으로 입력 비밀번호를 해당 반복만큼 돌려줘야 같은 값이 나오기 때문에 동일한 입력에 대한 동일한 출력이 나오는 해시의 문제를 해결 .. 

 

정리

로그인 관련

  • 그동안은 심플하게 처리.. 
  • plain text 사용 x 
  • 원문 참조를 막기 위해서 단방향 해시 함수를 사용해야 한다.
    • 이때 그냥 단방향을 쓰면 유추가 가능해지기 때문에 salt와 여러번의 iterator를 사용해서 유추를 못하게 해야한다.
  • 또 다른 하나의 로그인에서 알아보아야 할 점..(쿠키와 세션)
    • 그간 세션 여부를 보고 로그인 판단을 진행 -> 이 경우 문제?? -> 로그인을 해서 브라우저에 있는 동안에는 유지가 되지만 브라우저를 끄는 순간 세션을 찾을 수는 없다. 서버상에는 존재를 해도 다시 찾아갈 방법이 없다.
    • 이를 해결하기 위해서는 쿠키에 세션 id 정도는 남겨주어야 한다.
      • 쿠키 expire time = (주지 않으면 브라우저가 살아있는 동안에만 살아 있음) 쿠키에 남아있는 세션 아이디로 다시 접근할 수 있게 해야 한다.