나는 생산하고 소비 할 REST 서비스 용 API를 개발 중입니다. 지난 며칠 동안 인증을 잘 처리하는 방법을 알아 내려고 노력했으며 마침내 무언가를 생각해 냈습니다.
응용 프로그램 스택에 대한 다음 사실을 기반으로 이것을 생각해 냈습니다.
- 클라이언트 및 서버는 .NET4 (클라이언트 프로파일의 클라이언트 부분)에 있습니다.
- WCF REST를 사용하여 서버 노출
- 앱의 사용자 이름과 비밀번호를 메모리에 유지하고 싶지 않습니다.
3부터는 서버에서 자격 증명을 확인한 후 클라이언트가 나머지 앱 전체에서 사용할 토큰을 다시 가져 오도록 토큰 인증 형식을 사용하고 싶었습니다. 사용자를 시간 초과하여 웹 버전과 데스크톱 버전 사이에서 사용자를 원활하게 이동할 수 있습니다. 통화 재생 및 변조 방지 방법을 알아 낸 후 다음을 생각해 냈습니다.
- 클라이언트는 인증을 시도하기 전에
ECDiffieHellmanCng
클래스를 사용하여 Diffie-Hellman 키 페어를 생성합니다 . - 키 쌍의 공개 부분을 사용자 이름 및 암호와 함께 유선으로 전송합니다 (물론 HTTPS를 통해).
- 서버는 사용자 이름 / 암호 조합을 인증하고 성공하면 다음을 수행합니다.
- 고유 한 세션 토큰을 만듭니다.
- 자체 DH 키 쌍을 생성하고 클라이언트가 제공 한 공개 키에서 공유 비밀을 계산합니다.
- 데이터베이스의 세션 토큰, 공유 비밀, 사용자 및 "마지막 작업"시간 (롤링 만료 창에 사용)을 기록합니다.
- 세션 토큰, 공개 DH 키 및 인증 성공 메시지를 반환합니다.
- 클라이언트는 응답에서 DH 키를 가져와 공유 비밀을 계산하고 토큰과 비밀을 모두 메모리에 저장합니다.
이 시점부터 세션 토큰 / 비밀 조합은 대부분의 다른 REST API와 같이 작동하며 요청에 지문이 찍히고 타임 스탬프 된 다음 일종의 HMAC가 생성됩니다. 클라이언트가 서버에 대해 작업을 수행 할 때마다 토큰 / 비밀 쌍을 확인하고 유효하고 만료되지 않은 경우 작업을 허용하고 세션의 마지막 작업 레코드를 업데이트합니다.
나는 명백한 결함을 보지 못하고 아마도 이것을 위해 과도하게 설계되었지만 어느 시점에서이를 수행하는 방법을 배워야합니다. HMAC는 재생 공격을 방지하고 DH 협상은 MITM 공격을 방지하는 데 도움이됩니다 (HMAC / DH 사이에서 머리 위로 실행 가능한 공격은 생각할 수 없습니다).
누구 든지이 구멍을 뚫을 수 있습니까?