문제

배경:

REST 웹 서비스를위한 인증 체계를 설계하고 있습니다. 이것은 "실제로"안전해야 할 필요는 없지만 (개인 프로젝트에 더 가깝습니다) 운동/학습 경험만큼 가능한 한 안전하게 만들고 싶습니다. 번거 로움을 원하지 않기 때문에 SSL을 사용하고 싶지 않습니다.

이 질문들은 특히 나를 시작하는 데 유용했습니다.

단순화 된 버전을 사용하려고 생각합니다 아마존 S3의 인증 (좋아요 OAUTH 그러나 내 요구에 너무 복잡해 보인다). 무작위로 생성 된 것을 추가하고 있습니다 목하, 재생 공격을 방지하기 위해 서버가 요청에 제공합니다.

질문에 도달하려면 :

S3와 OAUTH는 모두 선택한 헤더와 함께 요청 URL에 서명하는 데 의존합니다. 그들 중 누구도 요청 본문에 서명합니다 게시물 또는 요청을 위해. 이것은 URL과 헤더를 유지하고 요청 본문을 공격자가 원하는 데이터로 대체하는 중간 중간 공격에 취약하지 않습니까?

서명 된 문자열에 요청 본문의 해시를 포함시킴으로써 이것에 반박 할 수있는 것 같습니다. 이것이 안전한가요?

도움이 되었습니까?

해결책

이전 답변은 데이터 전송의 맥락에서만 SSL을 언급했으며 실제로 인증을 다루지 않았습니다.

당신은 실제로 REST API 클라이언트를 안전하게 인증하는 것에 대해 묻습니다. TLS 클라이언트 인증, SSL을 사용하지 않는 한 홀로 REST API를위한 실행 가능한 인증 메커니즘이 아닙니다. 클라이언트가없는 SSL authc는 섬기는 사람, 그것은 당신이 정말로 당신이 정말로 인증하기를 원하기 때문에 대부분의 REST API와 관련이 없습니다. 고객.

TLS 클라이언트 인증을 사용하지 않으면 Digest 기반 인증 체계 (Amazon Web Service의 사용자 정의 체계와 같은) 또는 OAUTH 1.0A 또는 HTTP 기본 인증 (그러나 SSL에 대한 HTTP 기본 인증)과 같은 것을 사용해야합니다.

이 제도는 요청이 예상되는 누군가가 전송했음을 인증합니다. TLS (SSL) (클라이언트 인증없이)는 와이어를 통해 전송 된 데이터가 손상되지 않은 상태를 유지합니다. 그것들은 분리되어 있지만 보완적인 우려입니다.

관심있는 사람들을 위해 나는 HTTP 인증 체계 및 작동 방식.

다른 팁

REST는 웹 표준으로 작업하는 것을 의미하며 웹에서 "보안"전송 표준은 SSL입니다. 다른 모든 것은 일종의 펑키하고 고객을위한 추가 배포 노력이 필요하며, 이는 암호화 라이브러리를 사용할 수 있어야합니다.

SSL에 전념하면 원칙적으로 인증에 필요한 멋진 것은 없습니다. 다시 웹 표준을 사용하여 HTTP Basic Auth (각 요청과 함께 전송 된 사용자 이름 및 비밀 토큰)를 사용할 수 있으며 정교한 서명 프로토콜보다 훨씬 간단하고 안전한 연결의 맥락에서 여전히 효과적입니다. 비밀번호가 평범한 텍스트를 넘어서지 않도록해야합니다. 따라서 비밀번호가 일반 텍스트 연결을 통해 수신되면 비밀번호를 비활성화하고 개발자에게 우편으로 보내실 수도 있습니다. 또한 일반 암호를 기록하지 않은 것처럼 자격 증명이 영수증시 어디에서나 기록되지 않도록해야합니다.

HTTP 다이제스트는 비밀 토큰이 지나가는 것을 방지하기 때문에 더 안전한 접근법입니다. 대신 서버가 다른 쪽에서 확인할 수있는 해시입니다. 위에서 언급 한 예방 조치를 취하면 덜 민감한 응용 프로그램의 경우 과잉 일 수 있습니다. 결국, 사용자의 비밀번호는 로그인 할 때 이미 일반 텍스트로 전송됩니다 (브라우저에서 멋진 JavaScript 암호화를 수행하지 않는 한) 마찬가지로 각 요청에 따라 쿠키가 마찬가지입니다.

API를 사용하면 클라이언트가 비밀번호 대신 무작위로 생성 된 문자열을 통과하는 것이 더 좋습니다. 개발자는 웹 사이트에 웹 사이트에 로그인합니다. 따라서 개발자는 사이트에 로그인하여 API 확인에 사용할 수있는 새 토큰을 생성 할 수 있어야합니다.

토큰을 사용하는 주된 이유는 손상된 경우 교체 할 수 있기 때문에 암호가 손상되면 소유자는 개발자의 계정에 로그인하여 원하는 것을 수행 할 수 있기 때문입니다. 토큰의 추가 장점은 동일한 개발자에게 여러 토큰을 발행 할 수 있다는 것입니다. 아마도 여러 앱이 있거나 액세스 레벨이 다른 토큰을 원하기 때문일 수 있습니다.

(연결 SSL 전용에 대한 영향을 다루기 위해 업데이트되었습니다.)

또는이 문제에 알려진 솔루션을 사용하고 SSL을 사용할 수 있습니다. 자체 서명 된 certs는 무료이며 개인 프로젝트가 맞습니까?

신체의 해시가 URL의 매개 변수 중 하나로 필요하고 개인 키를 통해 URL이 서명 된 경우, Man-in-the-Middle Attack은 본문을 생성하는 내용으로 만 교체 할 수 있습니다. 같은 해시. 최소한 MD5 해시 값으로 쉽게 할 수 있고 SHA-1이 부러지면 사진을 얻습니다.

몸을 변조로부터 고정 시키려면 신체의 서명이 필요합니다. 신체의 서명이 필요합니다.이 광자는 시그니처를 생성하는 개인 키를 알지 못하기 때문에 중간에 사람의 공격이 끊어 질 가능성이 줄어 듭니다. .

실제로 원래 S3 인증 하다 약한 MD5 서명이 있지만 컨텐츠에 서명 할 수 있습니다. HMAC에 Content-MD5 헤더를 포함하는 선택적 관행을 간단히 시행 할 수 있습니다 (서명 할 문자열).

http://s3.amazonaws.com/doc/s3-develoyer-guide/restauthentication.html

그들의 새로운 V4 인증 체계가 더 안전합니다.

http://docs.aws.amazon.com/general/latest/gr/signature-version-4.html

귀하의 제안은 고객이 서버와 통신하기가 어렵다는 것을 기억하십시오. 그들은 혁신적인 솔루션을 이해하고 그에 따라 데이터를 암호화해야합니다.이 모델은 공개 API에 좋지 않습니다 (Amazon Yahoo Google이 아닌 한).

어쨌든, 신체 내용을 암호화해야한다면 기존 표준과 다음과 같은 솔루션을 확인하는 것이 좋습니다.

XML 암호화 (W3C 표준)

XML 보안

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top