API 인증, 일회성 토큰 VS 동적 토큰


13

우리는 새로운 프로젝트를 진행하고 있으며, 두 명의 수석 개발자이며 서버와 클라이언트 간의 통신을 보호하기 위해 토큰을 사용하는 방법에 대한 사거리를 가졌습니다.

첫 번째 제안 : (일회성 토큰 AKA 정적 토큰)

  1. 클라이언트는 사용자 이름과 비밀번호 및 current_time (이 변수는 서버의 데이터베이스 및 클라이언트 측에도 저장 됨)을 API로 보내 기본 토큰을 요청하고 서버는 입력을 해석하고 해시 된 토큰을 렌더링합니다 (예 : 58f52c075aca5d3e07869598c4d66648)는 데이터베이스에 저장하고 클라이언트에 반환합니다.

  2. 클라이언트는 이제 1 차 토큰을 저장하고 1 차 토큰 + 인증 요청에서 전송 된 current_time 변수를 사용하여 새 해시 토큰을 작성합니다 (이 새로운 토큰을 main_token이라고 함). 또한 서버는 동일한 알고리즘을 사용하여 동일한 토큰을 작성합니다. .

  3. 클라이언트가 서버 API를 쿼리 할 때마다 main_token을 서버로 전송합니다. 이제 서버는 서버에서 생성 된 토큰을 클라이언트가 보낸 main_token과 비교합니다 (일치하는 경우 사용자가 실제임을 의미).

두 번째 제안 : (동적 토큰)

  1. 클라이언트는 두 개의 임의의 키를 생성합니다 ($ key1 = rand (10000,90000); $ key2 = rand (10000,90000);) API의 각 요청에서 클라이언트는 쿼리 유형을 사용하여 해시를 생성하고 복잡한 알고리즘으로이 두 키 + 해시를 서버로 보냅니다.

  2. 서버는 클라이언트에서 사용 된 것과 동일한 알고리즘을 사용하여 해시를 생성하고 클라이언트가 보낸 것과 비교합니다. 일치하는 경우 서버는 쿼리를 처리합니다.


문제는 API 요청을 보호하기 위해 가장 논리적이고 안전한 방법은 무엇입니까?


2
두 번째는 어떻게 인증 매체입니까? 이 있어야 정식 기술의 클라이언트가 사용하는, 그렇지 않으면 클라이언트는 단지 키를 한 경우 알 수있는 방법이 없다 서버에서 뭔가 기원합니다. 두 번째 기술에서, 로그인이 완료되면 클라이언트가 클라이언트와 동일한 것을 보장하기 위해 서버가 서버에서 시작한 것은 무엇입니까?
Jimmy Hoffa

1
어쩌면 내가 뭔가를 잃어 버렸을 수도 있지만 인증 메커니즘으로 OAuth를 사용하지 않는 이유는 무엇입니까? 표준이며 고객이 모든 언어로 사용할 수있는 라이브러리가 있습니다.
Icode4food

답변:


14

나는 일반적으로 첫 번째 접근법을 정말로 좋아합니다.

  • 이해하고 구현하는 것은 간단합니다
  • 안전하다 (나의 지식으로)
  • 과거에 사용 된 드문 접근법이 아닙니다.

내가 명심해야 할 첫 번째 사항에 대해 언급하지 않은 한 가지, 토큰을 해시하는 데 사용 된 타임 스탬프에는 TTL 만료가 너무 짧아서 (1 초와 같이) 메시지가 전송되지 않았 음을 확인합니다 12 시간 전 메시지의 동일한 타임 스탬프 및 토큰; 분명히 합법적으로 계산되지만이 경우에는 그렇지 않습니다.

이것들이 당신이 고려하고있는 유일한 두 가지 옵션이라면, 나는 많은 방법이 있기 때문에 다른 접근법도 살펴보고 싶습니다. 내가 실제로 나열하는 것 이상. 이것들은 당신의 목적에 더 잘 맞는지 알아보기 위해 공부할 가치가있는 일반적인 인증 접근법이며, 다른 것을 이해하지 않으면 어떤 접근법을 강화할 것인지에 대한 아이디어를 얻을 수 있습니다.

메모를 수행, 나는 하지 보안 전문가.


OAuth / 연합

이 방법에서는 소비 코드가 토큰 / 인증서 / 자신의 토큰을 요청하고이를 전달하는 제 3 자 보증인이 있습니다.이 시점에서 필요한 것은 제 3 자에게 제공된 키가 합법적입니다.

찬성:

  • 표준 기반
  • 다른 사람의 시스템에서 다른 사람이 문제를 발견하므로 불안이 발생하는지 확인할 수 있습니다.
  • 인증 작업이 훨씬 덜 필요합니다.

범죄자:

  • 기본 서비스에서 인증을 분리하려면 타사 서비스 담당자 및 해당 API를 처리하거나 고유 한 "타사"를 생성 및 호스팅해야합니다.
  • 많은 서비스 잔인하지만 개념적으로 고려할 가치가있는 경우

비동기 인증서

여기에서 클라이언트가 사용자를 만들 때 공유 한 공용 인증서로 통신을 암호화하게합니다. 귀하는 귀하와 관련된 개인 키를 사용하여 암호를 해독합니다. 일반적으로 챌린지-응답과의 통신을 시작하여 그들이 누구라고 주장하는지 예상 할 때 암호화 / 암호 해독 할 수 있음을 보여줍니다. 챌린지 응답을 사용하지 않는 "동기"접근 방식이 가능하지만 보안이 약간 떨어지고 시간 동기화 문제가있어 까다로울 수 있습니다.

에서 노벨 (그래 정말? 노벨, 알아?)

토큰은 일회성 비밀번호를 생성하는 기준으로 변수를 사용합니다. 이 변수를 시도라고합니다. 암호를 생성하는 데 사용되는 변수를 결정하는 두 가지 주요 방법은 비동기 또는 동기입니다.

비동기식 또는 챌린지-응답 방법을 사용하면 서버 소프트웨어는 토큰 장치가 암호화 할 외부 챌린지 (임의로 생성 된 변수)를 토큰에 보냅니다. 토큰은이 챌린지 변수, 암호화 알고리즘 및 공유 암호를 사용하여 올바르게 암호화 된 응답 인 응답을 생성합니다.

동기식 방법을 사용하면 비밀번호를 생성하는 데 사용 된 시도 변수는 토큰과 서버에 의해 내부적으로 결정됩니다. 각 장치 내에서 시간 카운터, 이벤트 카운터 또는 시간 및 이벤트 카운터 조합이 챌린지 변수의 기초로 사용됩니다. 토큰과 서버는 각각 자체적으로 자체 카운터에서 챌린지 변수를 내부적으로 결정하므로 시간 카운터와 이벤트 카운터가 동기화 상태를 유지하는 것이 매우 중요합니다. 서버와 토큰의 동기화가 매우 쉽지 않기 때문에 대부분의 구현에서는 카운터간에 일정량의 드리프트를 허용합니다. 일반적으로 이러한 카운터 값의 작은 범위 또는 창은 암호를 계산하는 데 사용됩니다. 그러나 토큰과 서버가이 창을 벗어나 동기화되지 않으면

찬성:

  • 인증서에는 신뢰할 수 있고 위조하기 어려운 CA 루트가 있습니다.
  • 인증서 저장소를 쉽게 관리 및 유지 관리하기위한 운영 체제에는 표준 기능이 있습니다.
  • 잘 연구 된 접근 방식, 사용 가능한 많은 정보
  • 다양한 다른 것들과 함께 만료는 표준 인증서의 내장 기능이며 일반적으로 강력합니다.

범죄자:

  • 인증서는 프로그래밍 방식으로 작업하기 까다로울 수 있습니다.
  • 외부 CA가 필요한지 여부에 따라 무료가 아닐 수 있습니다
  • 예상 루트 트러스트가 구성되도록 인증서 저장소를 수동으로 유지 관리해야 할 수 있음

NTLM

이것이 작거나 내부 전용 서비스이고 Windows 환경에있는 경우 표준 NTLM 인증을 사용하여 액세스를 보장하는 데 아무런 문제가 없습니다. 특히 IIS를 사용하는 경우 가장 간단한 방법입니다. web.config에서도 유지 관리 및 구성이 쉽습니다.

찬성:

  • 매우 쉽게 구성, 구현 및 유지 관리

범죄자:

  • 최소한의 상호 운용성
  • 공개 인증에는 충분하지 않습니다

논 세스

인증 방식에서 nonces로 작업 할 때 서비스에서 nonce를 얻는 방법을 제공합니다. 이 메소드는 각 요청에서 고유 한 임의의 문자열 또는 데이터 조각 ( "nonce")을 리턴합니다. 다른 방법에 대한 모든 요청은 이제 nonce를 검색해야하며 요청에 대한 암호화 알고리즘에서 사용됩니다. 여기서 값은 서버가 사용 된 넌스를 추적하고 넌스의 재사용을 허용하지 않는다는 것입니다. 이는 하나의 넌 스가있는 요청이 있으면 해당 넌스에 대한 요청을 다시 만들 수 없기 때문에 재생 공격을 완전히 방지합니다. nonces가 요청되면 사용 가능한 nonces 목록에 추가됩니다. 사용 된대로 사용 가능한 목록에서 사용 된 목록으로 이동됩니다.

찬성:

  • 아주 잘 재생 공격을 방해
  • 구현하거나 이해하기가 전혀 어렵지 않습니다.

범죄자:

  • 클라이언트는 각 요청마다 두 개의 요청을해야합니다 ( 특정 요청 에 대해서만 논스를 요구함으로써 줄일 수 있음 )
  • nonces 관리가 필요합니다.
  • nonces에 대한 추가 요청을 요구하여 성능에 부정적인 영향을 미칩니다 (트랜잭션은 nonces로 작업하는 데 드는 자원 비용을 추가로 증가시킵니다)

TTL은 1 분보다 짧지 만 1 분보다 짧을 수 있습니다 (HTTP / HTTPS를 전송으로 가정). TTL은 전송 시간 지연에 따라 다릅니다 (즉, 직접 연결보다 전자 메일의 경우 훨씬 더 깁니다).
Donal Fellows

1
당신은 kerberos를 잊었다 . 그리고 나는 질문이 제안하는 것처럼 자신의 인증 / 토큰 패키지를 굴리는 것에 대해 매우 강한 경고를했습니다. RYO 인증은 잘못되기 매우 쉽습니다. 예를 들어 OP의 두 번째 경우에서 8 만 5 자리 숫자 값의 시드 키 공간을 사용하는 것이 있습니다. 또한 사용하는 해시 (첫 번째 사례)에주의해야합니다. 많은 사람들이 이제 무지개 테이블 조회에서 사소하게 깨졌습니다.

1
대답에 대해 대단히 감사합니다. 나는 그 프로젝트에서 옮겼지만이 질문을 내가 좋아하는 것으로 유지합니다. 답변이 완전하지 않으므로 답변을받지 못했습니다. 그러나 소설이 나쁘다는 것은 무엇입니까? :(
SAFAD

@SAFAD Novell에 대해 나쁘지 않은데, Novell에서 현대적인 것을 발견 한 보안 세부 정보에 대한 리소스를 찾을 때 방금 던져졌습니다. 회사가 오래 전에 죽었다고 생각했습니다. 오래 전에 요 글렌이 더 철저 할 수 있다고 언급했듯이 일반적인 승인 방법에 대한 간단한 개요를 제공하려고 노력 했으므로 동의합니다. Kerberos는 상당히 큰 감독과 좋은 선택입니다. 아마도 지금 추가하겠습니다.
Jimmy Hoffa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.