⭐️ 비밀번호 암호에는 단방향 해시함수(one-way hash function)가 일반적으로 쓰인다
import hashlib # 해시 라이브러리 모듈 임포트
m = hashlib.sha256() # sha256 아래에 설명.
m.update(b"비밀번호") # 인코딩한 비밀번호
m.hexdigest() # 암호화된 메세지 생성
특징
알고리즘의 한 종류로서 256비트로 구성되며 64자리 문자열을 반환한다. 어떤 길이의 값을 입력하더라고 256비트의 고정된 결과값을 출력한다. 일반적으로 입력값이 조금만 달라져도 출력값이 완전히 달라져서 출력값을 토대로 입력값 유추는 거의 불가능하다. 아주 낮은 확률로 입력값이 다름에도 불구하고 출력값이 같은 경우가 발생하는데 이것을 충돌이라고 하며 이러한 충돌의 발생 확률이 낮을수록 좋은 함수라고 평가된다. SHA256은 출력속도가 빠르다는 장점을 갖고 있다.
SHA256 참고링크
패스워드 별로 해시값들을 미리 계산해 놓은 테이블을 Rainbow table 이라고 한다. 크래킹하고자 하는 해시값을 테이블에서 검색해서 역으로 패스워드를 찾는다. 이를 이용해서 고속으로 검색해서 해킹을 할 수 있게 되어 있다. 레인보우 테이블을 이용한 공격으로 부터 방어하기 위해서는 패스워드를 가능한 한 길게, 그리고 다양한 종류의 문자를 포함하도록 사용하는 것이 좋다.
❗️ 크래킹 : 특정 목표에 피해를 주는 것을 목적으로 하고 있는 해킹. 일반적으로 사람들이 인식하고 있는 해킹은 크래킹이다.
레인보우 테이블 어택을 보완하기 위해 일반적으로 2가지 방법들이 사용된다
실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해시값을 계산하는 방법(랜덤한 문자열을 실제 비밀번호의 앞이나 뒤, 중간에 덧붙여서 원본의 길이가 길어지게 만드는 방법)
단방향 해쉬값을 계산한 후에 그 해쉬값을 입력값으로 하여 또 해쉬하고 또 이를 반복하는 것을 말한다. 보통 사용자가 작성한 패스워드가 짧거나 예측하기 쉬운 경우가 많은데 키스트레칭은 이를 어렵게 만들어준다.
Salting 과 Key Stretching을 구현한 해시함수 중 가장 널리 사용된다. 애초에 패스워드 저장을 목적으로 설계되어서 매우 강력한 패스워드 다이제스트를 생성하는 해시함수이다. 관련된 라이브러리도 언어별로 쉽게 찾을 수 있다.
import bcrypt
bcrypt.hashpw(b"비밀번호", bcrypt.gensalt())
bcrypt.hashpw(b"비밀번호", bcrypt.gensalt()).hex()
필요한 모든 정보를 자체적으로 지니고 있다. JWT 시스템에서 발급된 토큰은 토큰에 대한 기본정보, 전달할 정보(ex.로그인시스템이라면 유저의 정보), 토큰이 검증되었다는 것을 증명해주는 signature를 포함하고 있다. 자가수용적이기 때문에 두 개체 사이에서 손쉽게 전달될 수 있다. 웹서버의 경우 HTTP의 Header에 넣어서 전달할 수도 있고 URL의 파라미터로 전달할 수도 있다.
회원인증 : JWT를 가장 흔하게 사용한다. 유저가 로그인을 하면 서버는 유저의 정보에 기반한 토큰을 발급하여 유저에게 전달해준다. 그 이후에 유저가 서버에 요청을 할 때마다 JWT를 포함하여 전달한다. 서버가 클라이언트에게 요청을 받을 때마다 해당 토큰이 유효하고 인증되었는지 검증을 하고, 유저가 요청한 작업에 대하여 권한이 있는지 확인해서 작업을 처리한다. 서버측에서는 유저의 세션을 유지할 필요 없이(로그인, 로그아웃을 신경쓸 필요 없이) 유저가 요청을 했을 때 토큰만 확인하면 된다.
JWT 참고링크
유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인지를 확인하는 절차이다.(ex. 해당 유저는 고객 정보를 볼 수는 있지만 수정할 수는 없음) JWT를 통해서 구현될 수 있다. access token 을 통해 해당 유저 정보를 얻을 수 있기 때문에 해당 유저가 가지고 있는 권한(permission)도 확인할 수 있다.
❗️ 복호화(Decryption) : 암호문을 평문으로 변환하는 과정. 암호화의 반대말.