Authentication은 유저의 identification을 확인(유저의 아이디와 비밀번호를 확인)하는 절차이다.
access token
을 클라이언트에 전송access token
을 첨부해서 request를 서버에 전송함으로써 매번 로그인하지 않아도 된다.우리의 비밀번호는 항상 암호화 되어 data base에 저장된다.
만약 암호화되어 저장되지 않는다면 단순 data base해킹만으로도 유저의 비밀번호를 알아낼 수 있을 뿐 아니라 내부 개발자나 인력이 유저의 비밀번호를 마음대로 볼 수 있을 것이다.
비밀번호 암호에는 단방향 해시 함수(one-way hash fucntion)이 일반적으로 쓰인다.
단방향 해시 함수는 다양한 길이의 원본 메시지를 변환하여 정해진 길이의 암호화 된 메시지인 digest
를 생성한다. 원본 메시지를 알면 암호화 된 메시지를 구하기 쉽지만, 암호화 된 메시지로는 원본 메시지를 구할 수 없기 때문에 단방향이라고 한다.
test123
을 sha256
이라는 해시함수를 사용하면 ecd71870d1963316a97e3ac3408c9835ad8cf0f3c1bc703527c30265534f75ae
라는 값이 나온다.
또 test456
을 hash256
이라는 해시함수를 사용하면
383cff75042ed4dc61fbc2c0fd4c41d4a3eb21d27b16155d3a7358e5864d648c
라는 값이 나온다.
실제 비밀번호는 유사하지만 해시함수값은 완전히 다른것을 볼 수 있다. 이러한 효과를 avalance
라고 하며 비밀번호 해킹을 어렵게 만드는 요소이다.
단방향 해시 함수의 취약점을 보완하기 위해 일반적으로 다음 두가지의 보완점들이 사용된다.
Salting과 Key Stretching을 구현한 해쉬 함수중 가장 널리 사용되는 것이 bcrypt이다. bcrypt는 처음부터 비밀번호를 단방향 암호화 하기 위해 만들이전 해쉬함수 이다.
salt
를 추가하였다.
test123
을 hashpw
라는 함수를 사용하면 $2b$12$rit9rbyw6AqvDnCoWVmRL.LfJCSn3llGXcsCyyu6oIyOdVHepRcE
라는 바이트 값이 나온다. 이 값을 다시 16진수로 변환하면 243262243132243462366555754c743976304d762f747536745a637a2e694e67676f6a685857725954654d483869324e7967756344764f7a396d454f
값이 나온다
sha256 :
ecd71870d1963316a97e3ac3408c9835ad8cf0f3c1bc703527c30265534f75ae
bcrypt :243262243132243462366555754c743976304d762f747536745a637a2e694e67676f6a685857725954654d483869324e7967756344764f7a396d454f
암호학에서 salt는 데이터, 비밀번호, 통과 암호를 해시처리하는 단방향 함수의 추가 입력으로 사용되는 랜덤 데이터를 말한다.
과거에는 암호의 암호화 해시 함수만 시스템에 저장되었지만, 시간이 지나면서 중복되거나 공통적인 암호(hash가 동일함)를 식별할 수 없도록 추가적인 보호장치인 salt가 개발된 것이다.
참고
python | hashlib
On the Secure Hash Algorithm
family
Rainbow table attack
bcrypt
salt