2011-02-10 4 views
0

저는 보안 전문가가 아니므로, 제가 고안 한 인증 방식에 구멍이 뚫릴 수있는 사람을 찾고 있습니다. 문제입력 요청 : 서버 상태가없는 서버 세션 유지하기

개요 나는 클라이언트가 세션의 수명주기를 관리하는 인터페이스가 (이 웹 서버에 대한 HTTP 세션입니다,하지만 그것은 정말 중요하지 않습니다) : 같은 목표를 충족 계획.

무국적 서버는 호출자를 인증해야하는 일부 서비스를 제공합니다 (서버는이 인증을 수행 할 능력이 있습니다).

그러나 서버는 각 호출에서 자격 증명을 전달하는 등 각 호출시 호출자를 인증하지 않아도되는 것이 바람직합니다. (인증 프로세스가 비쌀 수 있습니다.)

또한 서버에서 세션 상태를 유지하지 않는 것이 좋습니다. 우선, 클라이언트와 서버 모두에서 독립적 인 세션 타임 아웃을 요구하는 취성 솔루션을 요구하고 있습니다 (클라이언트의 세션 타임 아웃은 제거 할 수 없습니다). 안정적인 세션 수명을 유지하려면 서버 시간 초과가 필요합니다. (클라이언트를 사용하여 적절한 시간에 세션을 명시 적으로 종료하는 대신). 또 다른 한가지로, 서버가 이런 종류의 상태를 저장하도록 설정되지 않았습니다.

서버에 명시적인 authenticate 메소드가 있습니다. 그러면 문제는 다음과 같습니다. 다른 방법이 호출되면 서버에 세션 상태를 저장하지 않고 호출자가 authenticate 메서드를 사용하여 이전에 인증했음을 서버가 확인하는 방법은 무엇입니까?

authenticate 방법은 입력 매개 변수로 자격 증명을 받아 들인다 : 여기

솔루션 제안

내가 함께 왔어요하는 제도입니다. 인증에 성공하면 서버는 다음 두 가지를 리턴합니다.

  • 인증이 수행 된 시간을 나타내는 시간 소인.
  • 더 메소드 호출에 개인 키

암호화 {사용자 이름, 타임 스탬프}의 튜플의 암호화 된 버전은 클라이언트가 서버에 다시이 값을 모두 전달합니다. 그런 다음 서버는 암호화 된 {username, timestamp} 튜플을 암호 해독합니다. 해독 된 타임 스탬프가 클라이언트가 보낸 암호화되지 않은 값과 일치하면 서버는 클라이언트가 이전에 인증되었음을 알게됩니다 (유효한 암호화 된 값을 얻는 유일한 방법 임). 해독 된 사용자 이름은 서버에 어떤 사용자가 인증되었는지 알려줍니다.

암호화 된 키의 유효 기간은 현재 시간의 x 시간 내에있는 타임 스탬프 만 허용하여 적용 할 수 있습니다. 이것은 세션 타임 아웃과 같지 않지만, 악의적 인 사람이 손상된 타임 스탬프를 사용할 수있는 창을 제한합니다.

그래서

나는이 방식은 수십 가지 방법으로 순진 것을 우려하고있다. 어떤 약점이나 나쁜 논리를 보았습니까?

답변

0

아무도 신경 쓰지 않는 경우 (이 질문에주의를 기울이지 않았다면 거의 불가능한 것처럼 보입니다!) 위에서 설명한대로 많은 계획을 세우게되었습니다.

세부 사항의 몇

하지만, 변화 :

  • 서버는 사용자 이름 (사용자에게 다시 전달) 세션 시작 타임 스탬프를 기반으로 세션 토큰, 및 염을 생성한다.
  • 클라이언트가이 토큰을 다시 서버로 전달하지 않습니다. 대신 MD5 해시가이 토큰과 연결된 전체 요청 내용에서 만들어집니다.
  • MD5 해시는 타임 스탬프와 사용자 이름 (및 요청)과 함께 서버로 전송됩니다. 그런 다음 서버는 세션 토큰을 다시 만들고 동일한 해싱 알고리즘을 수행합니다. MD5 해시가 일치하면 : 유효한 요청입니다.