it-swarm-korea.com

데이터를 보내는 클라이언트 응용 프로그램을 안전하게 인증하려면 어떻게해야합니까?

클라이언트 응용 프로그램에서 https를 통해 전송 한 웹 서비스 로깅/레코딩 사용자 데이터가 있습니다. 앱을 가장 한 가짜 도구가 아니라 클라이언트 응용 프로그램에서 데이터를 안전하게 전송하는 방법이 있습니까? 이상적으로는, 클라이언트에 난독 화 된 키를 숨기거나 "보안을 통한 보안"기술 등을 숨기고 싶지는 않습니다.

12

당신은 할 수 없습니다. 서버는 근본적으로 클라이언트를 신뢰할 수 없습니다 (일부 예외가 있습니다-클라이언트 시스템이 강화 된 경우 (하드웨어는 펌웨어를 확인하고, 펌웨어는 OS를 확인하며 OS는 모든 응용 프로그램이 실행되고 있는지 확인)) 그렇게 할 수 있습니다 (실제로-누군가는 아닙니다) 납땜 인두를 사용하면 항상 하드웨어 확인을 수정할 수 있습니다.)하지만 클라이언트를 100 % 제어하지 않으면 운이 없습니다.

고객이 가짜 데이터를 업로드 할 때의 위험은 무엇입니까? your 응용 프로그램이 데이터를 업로드하고 있음을 인증하지 않은 결과는 무엇입니까? 한 가지 어려운 질문 : 고객에게 가짜 데이터를 업로드 할 인센티브가 있습니까? 사용자가 가짜 데이터를 업로드 할 인센티브가 없다면 귀찮게하지 않을 것입니다.

한 가지 can do : 여러 인증 메커니즘 중 하나를 통해 응용 프로그램을 실행하는 사용자를 인증 한 다음 인증 된 사용자 ID 및 IP 주소와 함께 업로드 된 데이터를 저장할 수 있습니다 . 이렇게하면 사용자 does 가짜 데이터를 업로드하면 누가 변경했는지 추적 할 수 있습니다. 물론 이제 서비스에 개인 정보 보호 문제가있을 수있는 데이터 PII를 만들었습니다.

클라이언트를 인증해야하며 비밀이 있어야합니다. 휴먼 사용자가 클라이언트를 제어하는 ​​경우 사용자가 알고 있거나 액세스 할 수있는 일부 비밀을 사용하여 사용자를 등록하고 인증 할 수 있습니다.

클라이언트가 자동화되어 있고 클라이언트가 의존하는 하드웨어 및 소프트웨어 환경을 제어하지 않으면 클라이언트를 제어하는 ​​결정된 공격자가 직면 한 것은 운이 없습니다. 그러나 당신은 그것을 어렵게 만들 수 있습니다.

문제는 클라이언트 응용 프로그램 라이센싱의 일반적인 문제와 관련된 것으로 보이며 그에 대한 한 가지 접근 방식에 대한 좋은 개요가 있습니다 (Android apps in Java)).

http://Android-developers.blogspot.com/2010/09/securing-Android-lvl-applications.html

이를 환경에 맞게 조정하거나 상황에 맞는 다른 오픈 소스 라이브러리를 찾을 수 있습니다.

그건 그렇고, "보안을 통한 보안"은 괜찮습니다. 개인 키와 같은 비밀은 가장 좋은 계획의 일부입니다. 사람들이 피하려고하는 것은 "모호함을 통한 보안"입니다. 즉, 일을 복잡하게 만들거나 공격자가 알고리즘을 이해하지 못하는 척합니다.

8
nealmcb

10 불변의 보안 법칙 을 살펴보면, 법칙 3은 기본적인 수준에서 문제를 설명합니다.

법칙 3 : 나쁜 사람이 귀하의 컴퓨터에 제한없이 물리적으로 접근 할 수있는 경우, 더 이상 귀하의 컴퓨터가 아닙니다.

2
Steve

Kerberos를 사용하여 클라이언트와 서버간에 상호 인증을 수행 할 수 있습니다. 클라이언트를 처음 식별하기위한 대역 외 방법 (예 : 사용자에게 식별자를 발급합니다. 물론, 당신은 이제 그 식별자가 손상되지 않는 것에 의존합니다 ...

1
user185

다른 사람들이 말했듯이 클라이언트가 작성한 인증서로 클라이언트를 인증 할 때까지 클라이언트를 신뢰할 수 없습니다. 이 시점에서 전체 문제는 키/인증서 배포 문제로 귀결됩니다.

  1. 클라이언트는 실제 서버에서 좋은 인증서를 받고 있음을 어떻게 알 수 있습니까?
  2. 서버는 악의적 인 클라이언트에게 좋은 인증서를 제공하지 않는다는 것을 어떻게 알 수 있습니까?

이 질문에 답할 때까지 (올바로!) 인증 후 다른 모든 이벤트는 무례합니다.

0
Marcin