문제

이 질문의 명백함에 대해 사과하지만, 어떤 이유로 든 Apple 문서에서 설정 위치와 방법에 대한 결정적인 답변을 찾을 수 없었습니다. 비밀번호 정보가 저장됩니다. 내 질문 : 앱에 대한 자격 증명을 저장 해야하는 경우 설정을 사용하는 경우 비밀번호가 issecure = 예를 가진 Apple 설정 영역에 PSTEXTFIELDSPECIFIER TEXTFIELD에 암호가 입력되도록합니다. cfpreferencescopyAppValue, nsuserDefaults에 그것을 기록하지 않고 네트워크를 통해서만 안전하게 보내지 않으면 내 앱 설정에서 Keychain을 사용하여 비밀번호를 저장하고 검색하는 것과 비교할 때 저장 및 검색 방법은 얼마나 안전합니까? 입력 해 주셔서 감사합니다.

도움이 되었습니까?

해결책

CFPreferencesCopyAppValue 사용할 때 얻을 수있는 동일한 정보에 액세스하는 핵심 기초 방법입니다. NSUserDefaults. 보안 측면에서 기능은 정확히 동일합니다. 즉, 암호화되지 않았습니다. 그것은 그것이 가려진다는 의미에서만 안전합니다. "올바른"대답은 키 체인을 사용하는 것입니다.

이에 대한 카운터는 많은 응용 프로그램이 사용한다는 것입니다 NSUserDefaults 비밀번호를 저장합니다. 암호가 값의 정보에 대한 액세스를 제어하지 않으면 키 체인을 사용하려는 노력의 가치가 없다고 주장 할 수 있습니다. 설정 애플리케이션에서 보안 필드를 사용하는 데 유리한 두 번째 인수를 제공합니다. Keychain API는 끔찍하고 내 경험상 적어도 오류없는 코드를 작성하는 것은 까다 롭습니다.

다른 팁

설정 번들에 사용자의 비밀번호를 저장하지 마십시오.
안전하지 않습니다.

원래 비밀번호가 무엇인지 알 필요가 없으며 사용자가 입력하는 암호가 있는지 알아야합니다. 성냥 원래 비밀번호. iOS에서 암호를 처리하는 올바른 방법은

  • 다른 사람들이 언급했듯이 키 체인을 사용하십시오
  • SHA-512 또는 기타 암호화를 사용하여 암호화 단 방향 해시 기능을 생성하고 결과 해시와 소금을 저장하십시오. NSUserDefaults

이러한 옵션 중 암호를 암호화하고 해시+소금을 저장하는 것이 가장 쉬운 것입니다. 암호를 저장하기 위해하는 일은 다음과 같습니다.

  1. 사용자로부터 비밀번호를 가져 오십시오
  2. 임의의 소금 값을 만듭니다
  3. SHA-512와 임의의 소금 값을 사용하여 전방 전용 해시를 만듭니다.
  4. 결과 해시와 소금 값을 저장하십시오 NSUserDefaults - 해커는 해커가 원래 비밀번호를 결정하는 데 사용할 수 없으므로 안전한 장소에 저장할 필요가 없습니다.

이제 사용자가 암호를 입력하고 정확한지 확인 해야하는 경우 다음은 다음과 같습니다.

  1. 사용자로부터 비밀번호를 가져 오십시오
  2. 이전에 저장된 해시 + 소금 값을 잡으십시오 NSUserDefaults
  3. 원래 비밀번호를 암호화하는 데 사용한 것과 동일한 편도 해시 함수를 사용하여 전방 전용 해시를 만듭니다. 시도한 비밀번호와 소금 값을 전달하십시오. NSUserDefaults
  4. 결과 해시를 저장된 해시와 비교하십시오. NSUSerDefaults. 동일하면 사용자가 올바른 암호를 입력했습니다.

소금과 전방 전용 해시를 생성하는 코드는 다음과 같습니다.

NSString *FZARandomSalt(void) {
    uint8_t bytes[16] = {0};
    int status = SecRandomCopyBytes(kSecRandomDefault, 16, bytes);
    if (status == -1) {
        NSLog(@"Error using randomization services: %s", strerror(errno));
        return nil;
    }
    NSString *salt = [NSString stringWithFormat: @"%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
                      bytes[0],  bytes[1],  bytes[2],  bytes[3],
                      bytes[4],  bytes[5],  bytes[6],  bytes[7],
                      bytes[8],  bytes[9],  bytes[10], bytes[11],
                      bytes[12], bytes[13], bytes[14], bytes[15]];
    return salt;
}

NSData *FZAHashPassword(NSString *password, NSString *salt) {
    NSCParameterAssert([salt length] >= 32);
    uint8_t hashBuffer[64] = {0};
    NSString *saltedPassword = [[salt substringToIndex: 32] stringByAppendingString: password];
    const char *passwordBytes = [saltedPassword cStringUsingEncoding: NSUTF8StringEncoding];
    NSUInteger length = [saltedPassword lengthOfBytesUsingEncoding: NSUTF8StringEncoding];
    CC_SHA512(passwordBytes, length, hashBuffer);
    for (NSInteger i = 0; i < 4999; i++) {
        CC_SHA512(hashBuffer, 64, hashBuffer);
    }
    return [NSData dataWithBytes: hashBuffer length: 64];
}

이 예제에 대한 코드는 여기에 있습니다. http://blog.securemacprogramming.com/2011/04/storing-and-testing-credentials-cocoa-touch-edition/

iPhone의 Keychain은 사용자 정의 암호화를 사용하지 않는 한 가장 안전 할 것입니다. NSUSERDEFAULTS는 안전한 것으로 간주되지 않습니다.

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