실제 우리의 통신은 아래와 같은 형식인 Challge-Response형식을 통해 상호 인증을 하고 있다.
이는 통신의 처음부분에 발생한다.
위의 그림과 같이 서버를 인증하는 것은 Cert면 충분하지만 사용자 인증은 그렇게 쉽지는 않다.
이러한 방식은 아래의 사진에서 말하는 방식에 대해 기초하고 있다.
이러한 방식을 하나만 사용하는 것이 아니라 2~3개를 합쳐서 인증한다.
password를 구축하는 이유는 구축비용이 저렴하다는 장점이 있고 사용자도 편리하다.(별도의 저장공간이 필요 X)
이 방법은 replay공격을 막기 위해 사용되는 방식이다.
따라서 이 방식에는 nonce라는 number used once 한번사용되는 숫자가 필요하다.
매 세션이 진행될 때마다 nonce를 바꾸면 되기에 replay 공격을 자연스럽게 막을 수 있다.
위의 사진은 Pw의 경우이다.
이 방법이 안전한 것은 아니다.
그러나 nonce를 주기에 공격자가 공격을 할 시 nonce'으로 변경되기에 과거의 것이 재사용되는 것이 자동적으로 막아진다.
둘간에 사전에 미리 대칭키를 공유 했다고 했을 경우 한방향 인증하는 방법은 다음과 같다.
Rb를 challge로 주고 이 Rb에 대해 MAC을 주고 이를 bob이 정상적으로 MAC을 검증한다면 이는 bob에게 alice를 인증하게 된다.
또 다른 방법 Timestamp
이 역시 timestamp의 도움을 받는다면 한번으로 인증이 가능하다.
이 방법은 Oauth와 같이 SNS로그인에서 사용된다.
이는 상호인증이 아닌 일방향인증이므로 이를 아래와 같이 구성한다면 상호인증이 가능하다.
상호인증 방법
근대 이러한 방식의 상호인증이 과연 안전할까?
그러나 이는 안전하지 않다.
위의 사진에서 보다싶이 공격자가 alice인척하면 서버에서 Rb에 대하 묻는다면 공격자는 이를 잠시 멈추고 다른 것으로 가서 Rb를 주면 서버는 이에 대한 MAC을 주므로 이를 위의 통신에서 사용하면 alice인척 입장이 가능하다.
이는 실제로 bob이 서버에 해당한다. 즉 서버는 자동반사적으로 respose와 challge를 자동으로 주므로 이렇게 구성하면 문제가 발생한다.
이것이 발생하는 이유는 Challge에 대응하는 response가 대칭성을 가지면 문제가 발생한다.
해결방법
이 역시 흘러가는 모든정보를 MAC으로 넣어 bob이 이를 확인하는 방법이다.
이 방식이 Timestamp 방식의 OTP이다.
이 방식은 timestamp 대신 nonce를 이용해 한방향 인증 방식이다.
상호 인증 역시 위에서 배운 방법으로 구성하면 된다.
이 역시 앞에서 보다 싶이 좌우 대칭이면 같은 문제가 발생한다.
이 방식 역시 Man-in-the-middle attack이 가능하다.
위의 그림에 대한 방식은 모든 메시지를 넣어 MAC을 만든다면 이러한 문제는 쉽게 해결 된다.
현재는 대칭키 대신에 MAC을 사용한다.
대칭키의 방식은 message가 길어지면 그에 대한 key나 output이 길어지는 문제점을 지니므로 일정한 output을 내는 MAC을 사용한다.
를 가진 OTP기기를 가지고 진행을 한다.
와 같은 방식으로 실제 은행과 사용자가 인증을 하려할 때 timestamp방식의 MAC을 서버에 전달하면 서버는 k, timestamp(전달 시간을 고려한 bound내) 를 넣어 MAC을 생성해 이를 비교하고 맞다면 인증을 아니면 거절하는 방식을 사용한다.
숫자가 커질 수 있으므로이는 mod 연산을 통해 줄이기도 한다.
이 방식은 secure한 channel이 필요 없다는 장점을 가진다.
그러나 실제로는 secure한 망 위에서 동작을 한다.
구체화한 방법은 아래와 같이 동작을 한다.
아래는 대칭키가 아닌 PKE방식이다.
한방향인증 방식
이는 Pk를 통한 인증은 가능하지만 Pk의 원소유자임을 알기 위해서는 필히 Cert가 필요하다.
Cert가 없을 경우 공격자가 중간에서 공격하는 Man in the middle attack이 가능하다.
또 방법에서 message를 노출하면 replay attack이 가능하므로 위와 같이 Rb를 MAC의 key로 해서 MAC을 생성해서 보낸다.
실제로는 KDF를 돌려 key를 구한다.
양방향 인증 방식
이 역시 message를 그대로 주는 것이 아닌 MAC을 통해 전달한다.
단 전제조건은 둘이 암호화용 Cert를 가져야한다.
현재는 이 방식을 사용하고 있지 않는다.
인증서 로그인을 하면 alice는 id와 cert를 보내고 이에 대해 Challenge-Response를 통해 이를 해결한다.
이 방식은 Rb가 무엇인지 모른다.
즉 alice에게 불리한 내용에 sign을 할 수 있다.
따라서 실제로는 아래의 방식을 사용한다.
자신이 뽑은 random Ra를 붙여 sign을 한다.
이는 상대방의 random에만 의존하지 않는다.
이 방법들은 alice가 bob에게 인증하는 방식이다.
그렇다면 상호인증을 하려면 위에서 본것과 동일하게 프로토콜을 구성하면 된다.
이러한 방식보다는 위의 모든 내용을 집어 넣어 message를 구성하는 방식이 적절하다.
구조에서 문제가 없지만 인증프로토콜에서의 설계가 안전에 문제로 인해 공격당할 수 있다.
사용자의 디바이스에서 생체 정보를 읽고 생체정보가 서버에 저장되지 않고 생체정보로 만들어지는 정보를 저장한다.
생체정보가 탈취당하면 변경이 불가능하기 때문이다.
따라서 사용자와 서버의 인증방법은
Only user authentication (user à auth. server)
Not considered server auth. (user ß auth. Server)
서버의 인증은 Cert를 통해 인증이 가능하다.
그러나 사용자 인증이 문제이므로 PW,OTP, Cert, ... 등등의 방법이 나온것이다.
생체인증에서 어려운점: 인식을 할때마다 오차범위내에서 값들이 변경이 된다.
즉 일정범위의 오차를 처리하는 것이 문제이다.
사용자가 자신의 생체정보를 등록하고 이러한 정보를 통해 인증하는 방식이다.
따라서 생체정보를 인식하고 전자서명용 Pk, Sk를 만들어고 Sk를 생체정보로 도출된 key를 가지고 암호화 한다.
그리고 PK를 서버에 보내면 등록이 마무리 된다.
추후 사용자를 인증할 때는 사용자의 생체정보를 인식하고 이 정보로 SK를 복호화하여 서버에서 주는 random Challenge를 sign을 해서 Response를 준다.
중요한 관건은 생제정보를 인식하는 f함수가 얼마나 정교한가에 달려있다.
이를 통한 ATM기기와 같은 Universal device에서 사용
위의 과정과 비슷하나 Universal device는 등록에서 값을 생성하고 삭제한다.
추후 인증 방식은 동일하게 구성되어있다.
현재 생체정보를 인식하고 사용하는 방식
사용자의 생체정보를 읽어 template파일로 저장하고 Pk,Sk를 만드는 것은 동일하지만 생체정보를 통해 인식할 때 패턴매칭이나 특이점을 통해 사용자를 인식한 후 template 파일을 통해 PK, SK를 생성해서 사용자의 인증을 수반한다.
사용자의 인증수단을 한개로 하는 것이 아니라 보안의 중요성에 따라 인증 방법을 2~4개로 구성하여 사용자를 인증하면된다.