2010-11-23 3 views
9

나는 작업중인 자바 스크립트 애플리케이션을 안전하게하는 방법을 연구 중이다. 이 애플리케이션은 APE (Ajax Push Engine)를 백엔드로 사용하는 채팅 클라이언트입니다.hmac로 javascript 클라이언트 보안하기

현재 누구나 페이지에 액세스하여 APE 서버에 GET/POST 요청을 할 수 있습니다. 등록 된 사용자에게만 채팅 클라이언트를 제공하고 싶습니다. 요청을 수락하기를 원합니다. PHP에서 사용자 이름/비밀번호 인증을 사용하여 사용자에게 페이지를 제공 할 수 있습니다. 그러나 일단 그들이 페이지를 가지고 있다면, 자바 스크립트를 수정하지 못하게하거나 잘못된 손에 빠지게하는 것은 무엇입니까?

클라이언트/서버 응용 프로그램을 보호하기위한이 방법은 유망한 같습니다 http://abhinavsingh.com/blog/2009/12/how-to-add-content-verification-using-hmac-in-php/

나는 그것이 개인 키를 전송에 의존하지 않기 때문에이 자바 스크립트 클라이언트에 이상적입니다 말한다 다른 소스를 가지고있다. 그러나 이것이 어떻게 될 수 있습니까? 위의 튜토리얼에 따르면 클라이언트는 개인 키를 제공해야합니다. 이 자바 스크립트를 가진 사람은 이제 그 사용자의 개인 키를 가지고 있기 때문에 이것은 매우 안전하지 않습니다. 내가 이해에서 이런 식으로 뭔가를 작동합니다 :

  1. 사용자 로그를
  2. PHP는 사용자 이름과 암호를 검증하는 사용자 이름과 암호에 사용자의 개인 키를 조회하고 자바 스크립트에 삽입
  3. Javascript는 개인 키를 사용하여 서명을 제공하고 모든 APE 요청이있는 공개 키를 제공합니다.
  4. APE는 계산 된 서명을 수신 된 서명과 비교하여 요청 처리 여부를 결정합니다.

자바 스크립트 응용 프로그램이 개인 키를 알아야 할 경우 어떻게 안전합니까?

도움 주셔서 감사합니다.

+1

안녕하세요 Walderman, 여기에서 게시물을 참조하십시오. 그래서이 기회를 블로그 게시판에서 설명한 작업에 설명해주십시오. 설명 된 메소드는 플로우 검증 메소드에 더 가깝습니다. 즉, 호출 된 ajax/javascript/api가 애플리케이션 제어 흐름을 통해 실제로 의도되었는지 확인하려는 경우입니다. 부스러기 정보가 서버 측에서 누락되었거나 유효하지 않은 경우 (시간 초과 또는 손상으로 인해) 단순히 호출을 무시합니다. 설명 된 방법은 클라이언트 측에서 개인 키를 보내도록 요청하지 않습니다. –

답변

0

제 3자가 연결하려는 API의 경우 HMAC 인증이 더 잘 수행됩니다. 클라이언트 브라우저에 쿠키를 작성하여 인증되었음을 나타내는 앱이 더 나을 것 같습니다. 그런 다음 각 Ajax 요청으로 해당 쿠키를 확인할 수 있습니다.

편집 : 제 3 자 API를 위해 HMAC가 더 잘 제공되었다고 말한 것에 대해 다시 생각해 봅니다. 전통적으로 HMAC에서 각 사용자는 자신의 개인 키를 얻습니다. 나는 이것이 귀하의 신청에 필요하다고 생각하지 않습니다. 아마도 하나의 마스터 개인 키를 유지하고 각 사용자에게 고유 한 "공용"키를 제공 할 수 있습니다 (공개 키라고하지만 사실은 사용자는 키에 대해 전혀 알지 못할 것입니다). 사용자가 로그인 할 때 두 개의 쿠키를 쓸 것입니다. 하나는 사용자의 공개 키 + 암호화 된 타임 스탬프와 타임 스탬프가 무엇인지 나타내는 다른 키의 조합입니다. 그런 다음 서버 측에서 암호화 된 키의 유효성을 검사하고 타임 스탬프가 주어진 임계 값 내에 있는지 확인할 수 있습니다 (예 : 앱에서 유휴 상태로있는 경우 10 ~ 30 분). 유효성이 확인되면 암호화 된 키와 타임 스탬프를 업데이트하고, 린스하고 반복하십시오.

+1

감사합니다. 어쩌면 내가 누락 된 것이지만, 원하지 않는 사용자가이 쿠키를 발견하지 못하게 막은 다음 요청을 보내기 위해 사용하는 것은 무엇입니까? – Walderman

+0

사람이 쿠키를 볼 수는 있지만 도메인에 있지 않으면 동일한 쿠키를 도메인에 쓸 수 없습니다. HMAC를 사용하여 개인 키를 사용하여 암호화 된 공개 키와 타임 스탬프의 조합을 작성할 수 있습니다. 이렇게하면 개인 키가 자바 스크립트 나 쿠키를 통해 공개되지 않습니다. – roto

+0

쿠키/토큰/키의 일종을 설정하고 각 아약스 요청과 함께 보내야한다는 의견이 여기에있는 것처럼 보입니다. 쿼리 문자열에 값을 포함하는 대신 쿠키를 사용하는 경우가 있습니까? 쿠키를 사용하는 것이 더 애매한 것 같지만 클라이언트가 쿠키를 사용하지 않으면 내 응용 프로그램이 작동하지 않습니다. – Walderman

2

답변 : 기술적으로 cannot prevent the user from modifying the JavaScript입니다. 그 일에 대해 아무 것도 할 수 없으므로 걱정하지 마십시오.

그러나 공격해야 할 공격은 Cross-Site Request Forgery (CSRF)입니다. 다른 도메인의 악성 스크립트는 브라우저에 저장된 쿠키로 도메인에 양식을 자동 제출할 수 있습니다. 이 문제를 해결하려면 AJAX 요청에 의해 전송 된 실제 데이터에 인증 토큰 (사용자 이름 또는 비밀번호와 관련이 없으며 채팅 클라이언트가있는 HTML 페이지에서 전송되는 충분히 무작위이어야 함)을 포함해야합니다 브라우저에서 자동으로 채워지지 않습니다).

+0

OAuth가하는 것과 비슷합니다. 서버가 인증 한 다음 x 시간 동안 클라이언트에 액세스 토큰을 제공합니다. – Walderman

+0

@Walderman : OAuth만큼 복잡하지 않아도됩니다. 제가 말하고자하는 것은 HTML 페이지 나 서버의 첫 번째 AJAX 응답에 권한 토큰 (예 : 쿠키에 사용 된 것과 같은)을 넣고 서버가 모든 후속 응답을 검사하도록하여 토큰이 보내지는지 확인하는 것입니다. 쿠키 이외의 다른 방법 *). – PleaseStand

1

javascript 애플리케이션에서 개인 키를 인식해야하는 경우 어떻게 안전합니까?

왜 안 되니? 그것은 사용자 자신의 비공개 키입니다. 따라서 다른 사람에게 기꺼이 제공하려는 경우 문제가됩니다. 비밀번호를 알려주는 것 외에 다른 사람이 귀하의 계정에 액세스 할 수 있다고 말하는 것과 다를 바 없습니다.

조금 생각하면 공개 키 암호화, HMAC 또는 그와 비슷한 것을 구현할 필요가 없다는 것을 알게 될 것입니다. 통신 채널 자체가 안전하다면 HTTPS를 사용하여 정상적인 세션 기반 인증이 수행됩니다.

+0

ajax 요청을받는 APE 서버가 HTTPS로 보안 설정되어있는 경우에도 누구든지 https : ///.ape.mydomain.com을 누르고 데이터를 보낼 수 있습니다. 현재는 인증을받을 필요가 없습니다. APE 서버는 PHP 세션을 인식하지 못하기 때문에 클라이언트의 신원을 확인하는 다른 방법이 필요합니다. – Walderman

+0

@Walderman :이 경우 PHP가 클라이언트에게 임의로 생성 된 임시 키를 보내고 클라이언트가 APE에 요청할 때마다이 키를 보냅니다. PHP와 APE가 액세스 할 수 있도록이 키를 데이터베이스에 저장해야합니다. – casablanca

관련 문제