설정에 비밀번호 저장에 대한 보안 영향.
-
12-09-2019 - |
문제
이 질문의 명백함에 대해 사과하지만, 어떤 이유로 든 Apple 문서에서 설정 위치와 방법에 대한 결정적인 답변을 찾을 수 없었습니다. 비밀번호 정보가 저장됩니다. 내 질문 : 앱에 대한 자격 증명을 저장 해야하는 경우 설정을 사용하는 경우 비밀번호가 issecure = 예를 가진 Apple 설정 영역에 PSTEXTFIELDSPECIFIER TEXTFIELD에 암호가 입력되도록합니다. cfpreferencescopyAppValue, nsuserDefaults에 그것을 기록하지 않고 네트워크를 통해서만 안전하게 보내지 않으면 내 앱 설정에서 Keychain을 사용하여 비밀번호를 저장하고 검색하는 것과 비교할 때 저장 및 검색 방법은 얼마나 안전합니까? 입력 해 주셔서 감사합니다.
해결책
CFPreferencesCopyAppValue
사용할 때 얻을 수있는 동일한 정보에 액세스하는 핵심 기초 방법입니다. NSUserDefaults
. 보안 측면에서 기능은 정확히 동일합니다. 즉, 암호화되지 않았습니다. 그것은 그것이 가려진다는 의미에서만 안전합니다. "올바른"대답은 키 체인을 사용하는 것입니다.
이에 대한 카운터는 많은 응용 프로그램이 사용한다는 것입니다 NSUserDefaults
비밀번호를 저장합니다. 암호가 값의 정보에 대한 액세스를 제어하지 않으면 키 체인을 사용하려는 노력의 가치가 없다고 주장 할 수 있습니다. 설정 애플리케이션에서 보안 필드를 사용하는 데 유리한 두 번째 인수를 제공합니다. Keychain API는 끔찍하고 내 경험상 적어도 오류없는 코드를 작성하는 것은 까다 롭습니다.
다른 팁
설정 번들에 사용자의 비밀번호를 저장하지 마십시오.
안전하지 않습니다.
원래 비밀번호가 무엇인지 알 필요가 없으며 사용자가 입력하는 암호가 있는지 알아야합니다. 성냥 원래 비밀번호. iOS에서 암호를 처리하는 올바른 방법은
- 다른 사람들이 언급했듯이 키 체인을 사용하십시오
- SHA-512 또는 기타 암호화를 사용하여 암호화 단 방향 해시 기능을 생성하고 결과 해시와 소금을 저장하십시오.
NSUserDefaults
이러한 옵션 중 암호를 암호화하고 해시+소금을 저장하는 것이 가장 쉬운 것입니다. 암호를 저장하기 위해하는 일은 다음과 같습니다.
- 사용자로부터 비밀번호를 가져 오십시오
- 임의의 소금 값을 만듭니다
- SHA-512와 임의의 소금 값을 사용하여 전방 전용 해시를 만듭니다.
- 결과 해시와 소금 값을 저장하십시오
NSUserDefaults
- 해커는 해커가 원래 비밀번호를 결정하는 데 사용할 수 없으므로 안전한 장소에 저장할 필요가 없습니다.
이제 사용자가 암호를 입력하고 정확한지 확인 해야하는 경우 다음은 다음과 같습니다.
- 사용자로부터 비밀번호를 가져 오십시오
- 이전에 저장된 해시 + 소금 값을 잡으십시오
NSUserDefaults
- 원래 비밀번호를 암호화하는 데 사용한 것과 동일한 편도 해시 함수를 사용하여 전방 전용 해시를 만듭니다. 시도한 비밀번호와 소금 값을 전달하십시오.
NSUserDefaults
- 결과 해시를 저장된 해시와 비교하십시오.
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는 안전한 것으로 간주되지 않습니다.