온라인에서 신원확인을 하기 위해선?
1. 신원확인 방법(Types of Identification)
1) 알고 있는 정보 : 비밀번호, 비밀 (password, secret)
2) 내가 가지고 있는 것 : 스마트 카드 (다른 곳으로 옮기기 힘든 하드웨어 토큰)
3) 나의 몸 : 지문, 홍채 (fingerprint, Iris)
2. 어떤 종류의 공격이 가능할까?
1) Impersonation
- 자기가 아니면서 위장해서 공격
2) Replay attack
- 프로토콜 메시지를 관측 후 캡처, 똑같은 메시지를 다시 재전송 한다
3) Interleaving attack
- 프로토콜을 여러명이서 사용할 경우
- 흘러다니는 메시지를 캡처해서 다른 사람에게 보냄
- 동시 세션이 열렸을 때 섞어서 보내는 공격
- 받는 사람은 다른 사람과 통신한다고 믿게 된다.
3. 어떤 종류의 인증프로토콜이 있을까?
1) Password
2) Symmetric key
3) Public key
4) ZKIP based (Zero-knowledge Interactive Proof)
4. Password 기반
1) ID와 패스워드를 같이 보낼 경우 공격자가 가로챌 수 있다.
2) 또는 패스워드 파일이 유출되면 위험하다.
3) 따라서 직접적인 패스워드 대신 해쉬함수로 연산한 결과를 보내준다.
4) 하지만 이 방법은 딕셔너리 어택(dictionary attack) 으로 인해 취약하다
5) 미리 사전파일을 만들 수 없도록 salt를 추가해서 암호화 한다.
6) 또는 패스워드가 노출되어도 한번만 사용하도록 one time password를 사용한다.
- Lamport의 one time password
1) 단순히 hash 체인을 만든다.
2) 해쉬(해쉬(해쉬(해쉬(....해쉬(난수 w)))))))) 방법으로
3) 인증방법은 다음그림과 같다.
4) 이 방법은 해쉬는 일방향이기 때문에 해쉬화 전의 값은 알 수 없다는 점을 이용한 방법이다.
5) 예를 들어 해쉬5번 하면 처음엔 해쉬4번한 값을 전달
6) 서버는 이 값을 해쉬화 해서 비교 후 맞으면 4번한 값을 저장
7) 그 다음 쓰려면 해쉬 3번 한 값을 전달
8) 서버는 이 값을 해쉬화 한다음 6)에서 저장한 값이랑 비교
9) .... 다 쓰게 되면 또 새로 만들면 된다.
5. 대칭키 기반
1) 단방향 인증 (Unilateral authentication)
- 여기서 델타의 값이 너무 작으면 인터넷 상황이 안좋을 경우 받지 못한다.
- 즉 정당한 사용자도 받지 못함을 의미한다.
- 델타의 값이 너무 길경우엔 replay attack이 가능해지므로 적당한 길이로 해야만 한다.
- 유효한 암호문을 읽으려면 유효한 키가 있어야 하는데 A는 그 키를 가지고 있다.
- 이를 통해 B에게 A임을 인증할 수 있다.
- 메시지를 재활용 불가능하기 위해 여기서는 타임스탬프를 사용했다.
- 하지만 서로 시간이 다르거나 전송속도가 느릴 경우 문제가 발생할 수 있으므로 다른 것도 생각해보자!
- 타임스탬프 대신 난수(rB)를 사용했다. 이러면 시간 동기화의 문제가 해결된다.
2) 양방향 인증 (mutual authentication)
- A의 인증은 단방향인증과 다를 것이 없다. 다만 여기선 rA 만들어 함께 암호화해서 보낸다.
- B는 rA와 rB의 순서를 바꾸어 암호화한다.
- 이는 B만 할 수 있으므로 B임을 인증할 수 있다.
6. 공개키 기반
- B 혼자서는 시그니처를 만들 수 없었으나 프로토콜을 수행하다보면 secret key의 정보를 계속 얻게 된다.
- 만약 B가 나쁜 의도를 가지고 있으면 위 그림과 같이 평문을 받아볼 수 도 있다.
- 이는 chosen ciphertext attack에서 decryption orcacle을 통해 B도 모르는 것을 A를 통해서 알 수 있는 것과 같다.
- 이와 같이 해쉬 값을 함께 보내면 B의 CCA 공격이 불가능해진다.
7. ZKIP 기반 (Zero-knowledge Interactive Proof)
- 공개키 기반은 프로토콜을 수행할수록 knowledge가 증가하는 단점이 있다.
- 그런 단점을 해결하면서 내가 무언가에 대해 알고있음을 알리고 싶을 때 어떻게 해야할까
- 바로 그 해답이 ZKIP이다.
- ZKIP 의 요구사항은 다음과 같이 3가지를 만족해야한다.
1) completeness : prover가 비밀을 알고 있다면 verifier은 이를 수용해야 한다.
2) soundness : 만약 verifier가 받아들인다면 prover은 비밀에 대해 알고 있어야 한다.
3) Zero-knowledge : verifier는 비밀에 대해 어떠한 정보도 얻을 수 없다.
- 이를 간단한 예로 표현하면 알리바바와 40인의 도적들로 표현할 수 있다.
1) 두개의 갈림길이 있다.
2) 알리바바는 한쪽으로 도망간다.
3) 도둑들은 50%의 확률로 놓친다.
4) 40인의 도둑들 모두 50%의 확률로 놓치게 된다.
5) 그런데 만약 다 놓친다면?
6) 이런 확률은 매우 낮지만 트랩도어가 존재한다면 가능하다.
7) 이 때 도둑들은 알리바바에게 트랩도어를 알려주지 않으면서 트랩도어가 존재함을 증명하려고 한다.
8. 위의 3가지 중에서 Zero-knowledgeness를 증명해 본다.
1) 실제 일어나는 일을 증명하고 싶으면 시뮬레이션을 만든 뒤 테스트를 해보면 된다.
2) 서로 일어나는 확률 분포가 비슷하면 제대로된 시뮬레이션을 만든 것이다.
'보안 > 정보보호이론' 카테고리의 다른 글
키 (Key) (0) | 2015.03.05 |
---|---|
안전한 서명 (Security Model for Signature) (0) | 2015.03.05 |
Discrete Logarithm Based Problem (0) | 2015.03.04 |
RSA (Rivest, shamir, adelman) (8) | 2015.03.04 |
공개키 (Public Key) (0) | 2015.03.03 |