Authentication (인증 방식)
일반적인 id,passwd 기반의 인증 방식
사용자 정보와 사용자 credential (id/passwd)를 데이타베이스에 저장해놓고, 사용자로 부터 id/passwd를 입력받아, 이를 비교하여 인증하는 방식.
일반적은 중소 규모 사이트 개발에는 RDBMS를 사용하는 것이 일반적이며,조직 구조, 여러가지 Role, 권한등을 저장할때는 LDAP등을 사용한다. 근래에는 대규모 사용자를 저장하기 위해서 Cassandra와 같은 NoSQL을 저장하는 경우도 많다.
이러한 저장소에 비밀 번호를 저장할때 평문으로 저장하는것 보다, 암호화된 형태로 저장하는 것이 좋다. 그래서 MD5나 SHA1같은 Hash로 변경해서 저장한다. 이렇게 하면, Hacker에 의해서 데이타 베이스가 탈취되더라도 데이타 베이스내의 passwd는 Hash 값만 저장되어 있기 때문에, 원본 passwd는 알아낼 수 가 없다.
hash = sha1-256(passwd)
그렇다면 원본 passwd를 알아낼 수 없다면, 인증은 어떻게 할까? 답은 쉽다. 사용자가 입력한 passwd를 같은 알고리즘으로 Hash값을 계산한 후에, 데이타 베이스에 저장된 Hash 값과 일치하는지를 체크하면 된다.
이런 Hash 알고리즘도 요즘은 어느정도는 복호화가 가능하다. asdf1234의MD5 hash 값은 1adbb3178591fd5bb0c248518f39bf6d를 http://www.md5decrypt.org/를 통해서 테스트 해보면, MD5 Hash를 쉽게 디코딩 할 수 있다 비밀번호나 스트링등을 MD5로 변환한 dictionary를 가지고 있다가, 이 dictionary를 기반으로 하여 search를 하면, Hash 전의 값을 찾아내는 방법이다.
이를 보안상의 헛점을 극복하는 방법이 SALT라는 기법인데, password를 hash로 변경하기 전에 password 끝에 random string을 붙여서 Hash로 변경하면, dictionary 기반의 attack에서는 random string이 끝에 붙어 있기 때문에, dictionary에 저장되어 있을 가능성이 상대적으로 낮게 되고, 이로 인해서 이러한 dictionary attack을 회피할 수 있다.
hash = sha1-256( strcat(passwd,salt) )
이때 salt도 데이타 베이스에 hash 값과 함께 저장한다.
Salt의 길이를 늘리고, random화 하면, 보안 수준도 같이 올라간다.
여기에 조금 더, 복잡도를 높이는 방식은, salt에 의해서 계산된 hash값을 다시 같은 salt를 더해서 N번 재 hash하는 방식이 있다.(보통 1000번 이상의 루프를 추천합니다.)
hash = sha1-256( strcat(passwd,salt) )
hash = sha1-256( strcat(hash,salt) )
:
:
X.509 기반 인증
X.509 PKI 기반의 인증서를 이용하여 서버가 클라이언트를 인증하는 방식으로, 쉽게 이야기 해서, 클라이언트를 인증할때, id,passwd를 이용하는 방식이 아닌 인증서를 사용하는 방식이다. 인터넷 뱅킹의 공인 인증서등을 생각하면 되며, 양방향 SSL을 사용하면, 이 방식의 인증을 구현할 수 있다.
특히 서버간의 통신에 대해서, 강한 인증이 필요한 경우, 양방향 SSL을 사용하게 되면, 서버간의 인증을 쉽게 구현할 수 있다.
'아키텍쳐 > Security & IDM' 카테고리의 다른 글
Java keystore file (0) | 2013.09.27 |
---|---|
SSL/TLS 관련 개념 링크 (2) | 2013.09.24 |
Federation과 SSO 에 대한 주요 표준 (메모) (0) | 2013.06.08 |
Claim based Authentication (CBA) (0) | 2013.06.07 |
SAML 기반의 web sso 원리 정리 (1) | 2013.06.04 |