2016-10-29 5 views
2

사용자가 API 키를 사용하여 서버에 요청을 보내는 iOS 애플리케이션을 구축 중입니다. 나는 누군가가 기본적으로 소스 코드를 볼 수 있습니다 리버스 엔지니어링에 대해 읽은소스 코드의 API 키를 숨기기

NSSTRING* secretAPIkey = @"12345secretKey"; 

: 나는 소스 코드 내부의 정적 문자열이 키가해야 할 때 문제가 발생합니다 입력해도.

내 솔루션 : 1. 여러 정적 문자열, 다음 하나

nsstring *1 = @"1"; 
nsstring *2 = @"2"; 
nsstring *complete [nsstring stringwithformat:@"%@%@",1,2]; 
and so on.. 
로 결합의 Info.plist에 저장
    1. 을.
    2. 모든 사용자가 동일한 API 키를 필요로하기 때문에 키 체인이 모든 응용 프로그램에서 전역인지는 확실하지 않습니다.

    다른 해결책이 있습니까? 최선의 접근 방식은 무엇입니까?

  • +1

    먼저 방어하려는 공격자의 레벨을 정의하십시오. iOS 응용 프로그램이 Apple 키로 Apple에 의해 암호화된다는 것을 고려하면 아무도 나머지에서 이진을 검사 할 수 없습니다. 액세스 키를 얻으려면 iOS 장치가 jailbroken되어 있고 해킹 도구가 설치되어 있어야합니다. 이러한 도구를 사용하면 실행하기 전에 앱을 실행하고 중지 할 수 있으며 그 시점에 이진 파일을 검사 할 수 있습니다. 이것은 당신이 보호하고있는 공격자의 레벨입니까? – zaph

    답변

    0

    앱이 작동하려면 인터넷 연결이 필요한 경우 https 및 인증을 사용하여 웹 서버에서 API 키를 가져오고 선택적으로 MITM 공격을 방지하기 위해 인증서 고정을 사용할 수 있습니다.

    +0

    나는 그렇게 잘 생각했다. 인증 된 웹 서버의 문제점은 내가 사용하는 경우 .htaccess 기본 권한을 말하도록 할 수 있습니다. 앱의 URL에 암호와 suename을 쓸 필요가 있습니까? xcode의 URL : https : // admin : [email protected]/secret.php 여기서 PHP 파일은 MySQL의 키를 반환합니다. –

    +0

    일반적으로 사용자 계정과 로그인이 필요합니다. – zaph

    +0

    그래,하지만 실제 키를 얻으려면 PHP 파일을 가져 가라. 인증을 통해 PHP 파일을 보호해야합니다. 즉, 비밀번호와 사용자 이름으로 ULR을 앱에 하드 코딩해야합니다. URL : @ "user : [email protected]/getAPI.php " 그런 다음 값을 추상 문자열로 반환하고 Key를 문자열에 저장합니다 (예 : nsuserdefaults). API에 대한 요청은 항상 가져올 필요가 없습니다. –

    0

    AES를 사용하여 키를 암호화하고 암호화 된 버전을 소스 코드에 넣은 다음 나중에 해독 할 수 있습니다. this question을 참조하십시오. 이것은 여전히 ​​리버스 엔지니어링 할 수 있지만 훨씬 더 어렵게 만듭니다.

    +0

    암호화 및 키 체인에 관한 간단한 질문입니다. [: @ "superSecretAPIKey"forKey : kSecAttrPassword 키 체인의 setObject] , KeychainItemWrapper * 키 체인 = [[KeychainItemWrapper ALLOC] initWithIdentifier : : : "뭔가"accessGroup @ 전무] 키 체인 구문은 다음과 같을 것 "superSecretAPIKey"는 여전히 키 체인 구문 내의 정적 문자열입니다. 문제가되지는 않습니까? –

    +0

    @JimmieMagnusson you r 그것이 응용 프로그램 외부에서 API 키를 암호화하고 소스 코드에서 이미 암호화 된 키를 사용하는 것이 좋습니다. 따라서 소스 코드에서 문자열을 검색 할 하이재커가 즉시 액세스 할 수 있습니다. –

    +0

    그렇다면 앱 외부에서 키를 암호화하는 것을 어떻게 의미합니까? 그러면 어떻게 응용 프로그램에 넣을 수 있습니까? 사용자는 계정을 만들 때 키가 필요합니다. 앱 내부의 키를 암호화하는 것도 좋은 생각입니다. –

    0
    1. 그냥 바이트의 배열을 생성하고 초 첫 번째 바이트 당신의 메이크업 추가, 예를 들어, 각 바이트로 다른 작업을 - 당신이 필요로하는 결과 ... 등등 곱셈 - 뺄셈, 세 번째 "비밀 API 키"를 문자열로 가져 오는 것. 따라서 처음에는 바이트 배열 만 가지고 누구든지 텍스트로 변환하는 방법을 모릅니다.

    2. 또는 암호화 알고리즘을 사용하십시오.

    참고 : https로 작업하지 않으면 누구나 요청을 스니핑 할 수 있습니다. 또한 https로 작업하는 경우 요청하는 방법을 알려주는 방법이 있습니다. 그래서 처음에는 문제에 대한 접근 방식이 올바르지 않습니다.

    +1

    1. 바이트를 무시하는 것은 그렇게 멀리 떨어진 공격자에게는별로 효과적이지 않습니다. 3. 암호화 키를 사용하여 문제를 해당 키 보안으로 이동시키는 경우. 3. 예, HTTPS를 사용해야하며 인증서 고정이 필요합니다. – zaph