IT

iOS : 앱 내에 사용자 이름 / 암호를 저장하는 방법

lottoking 2020. 3. 25. 08:34
반응형

iOS : 앱 내에 사용자 이름 / 암호를 저장하는 방법


iOS 앱에 로그인 화면이 있습니다. 사용자 이름과 비밀번호는에 다시 저장되고 NSUserDefaults앱을 다시 입력 할 때 로그인 화면에 다시로드됩니다 (물론 NSUserDefaults영구적 임).

이제 사용자는 사용자 이름 / 암호 저장 기능을 비활성화 할 수 있습니다.

그래서 NSUserDefaults그때는 지워질 것입니다.

그러나 내 응용 프로그램에는 사용자의 데이터베이스 쿼리 에이 사용자 이름 / 암호가 필요합니다. 따라서 : 제외하고 데이터를 저장할 위치는 NSUserDefaults? (이 장소는 사용자가 앱을 종료하거나 로그 아웃 할 때 삭제해야합니다.)


항상 키 체인을 사용하여 사용자 이름과 비밀번호를 저장해야하며, 사용자 이름과 비밀번호는 안전하게 저장되고 앱에서만 액세스 할 수 있으므로 앱이 종료 될 때 (필요한 경우) 삭제할 필요가 없습니다.

Apple은 키 체인 항목을 저장, 읽기 및 삭제하는 샘플 코드제공 하며 다음은 해당 샘플에서 키 체인 래퍼 클래스를 사용하여 키 체인 사용을 크게 단순화하는 방법입니다.

Security.framework를 포함하십시오 (Xcode 3에서 frameworks 폴더를 마우스 오른쪽 버튼으로 클릭하고 기존 프레임 워크를 추가하십시오. Xcode 4에서 프로젝트를 선택한 다음 대상을 선택하고 Build Phases 탭으로 이동 한 다음 Link Binary with Files 아래에서 +를 클릭하십시오) 및 KeychainItemWrapper .h &. m 파일을 프로젝트로 # 키 체인을 사용해야하는 곳마다 .h 파일을 가져온 다음이 클래스의 인스턴스를 만듭니다.

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];

( YourAppLogin 은 키 체인 아이템을 호출하기 위해 선택한 모든 것이 될 수 있으며 필요한 경우 여러 아이템을 가질 수 있습니다)

그런 다음 다음을 사용하여 사용자 이름과 비밀번호를 설정할 수 있습니다.

[keychainItem setObject:@"password you are saving" forKey:kSecValueData];
[keychainItem setObject:@"username you are saving" forKey:kSecAttrAccount];

다음을 사용하여 가져 오십시오.

NSString *password = [keychainItem objectForKey:kSecValueData];
NSString *username = [keychainItem objectForKey:kSecAttrAccount];

또는 다음을 사용하여 삭제하십시오.

[keychainItem resetKeychainItem];

래퍼의 ARC 버전이 필요한 경우 https://gist.github.com/1170641 링크 가 있습니다.


키 체인 을 통한 매우 쉬운 솔루션 .

시스템 키 체인을위한 간단한 래퍼입니다. 그냥 추가 SSKeychain.h, SSKeychain.m, SSKeychainQuery.hSSKeychainQuery.m프로젝트에 파일을 당신의 목표에 Security.framework를 추가합니다.

비밀번호를 저장하려면

[SSKeychain setPassword:@"AnyPassword" forService:@"AnyService" account:@"AnyUser"]

비밀번호를 검색하려면 다음을 수행하십시오.

NSString *password = [SSKeychain passwordForService:@"AnyService" account:@"AnyUser"];

setPassword저장하려는 값은 어디에 있고 저장하려는 forService변수는 어디에 있고 계정은 암호 및 기타 정보의 사용자 / 개체에 대한 것입니다.


당신은 단순히 사용할 수 있습니다 NSURLCredential, 그것은 단지 두 줄의 코드로 키 체인에 사용자 이름과 암호를 모두 저장합니다 .

자세한 답변을 참조하십시오 .


Obj-C와 ARC를 사용하여 iOS 8에서 키 체인을 사용하는 방법에 대답하기로 결정했습니다.

1) GIST의 keychainItemWrapper (ARCifief 버전)를 사용했습니다 : https://gist.github.com/dhoerl/1170641/download-KeychainItemWrapper.h 및 .m을 프로젝트에 추가 (+ 복사)하십시오.

2) 프로젝트에 보안 프레임 워크 추가 (프로젝트> 빌드 단계> 바이너리와 라이브러리 링크 확인)

3) 키 체인을 사용하려는 .h 및 .m 파일에 보안 라이브러리 (#import) 및 KeychainItemWrapper (#import "KeychainItemWrapper.h")를 추가하십시오.

4) 키 체인에 데이터를 저장하려면 :

NSString *emailAddress = self.txtEmail.text;
NSString *password = self.txtPasword.text;
//because keychain saves password as NSData object
NSData *pwdData = [password dataUsingEncoding:NSUTF8StringEncoding];

//Save item
self.keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];
[self.keychainItem setObject:emailAddress forKey:(__bridge id)(kSecAttrAccount)];
[self.keychainItem setObject:pwdData forKey:(__bridge id)(kSecValueData)];

5) 데이터 읽기 (로드시 로그인 화면> viewDidLoad) :

self.keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];

self.txtEmail.text = [self.keychainItem objectForKey:(__bridge id)(kSecAttrAccount)];

//because label uses NSString and password is NSData object, conversion necessary
NSData *pwdData = [self.keychainItem objectForKey:(__bridge id)(kSecValueData)];
NSString *password = [[NSString alloc] initWithData:pwdData encoding:NSUTF8StringEncoding];
self.txtPassword.text = password;

즐겨!


키 체인 래퍼를 사용하여 비밀번호를 검색하는 데 문제가있는 경우 다음 코드를 사용하십시오.

NSData *pass =[keychain objectForKey:(__bridge id)(kSecValueData)];
NSString *passworddecoded = [[NSString alloc] initWithData:pass
                                           encoding:NSUTF8StringEncoding];

샘플 코드를 확인하십시오. 샘플 코드에서 먼저 사과 래퍼를 사용해 보았지만 이것은 훨씬 간단합니다.


이걸로 해봐:

 KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];
[keychainItem setObject:@"password you are saving" forKey:kSecValueData]; 
[keychainItem setObject:@"username you are saving" forKey:kSecAttrAccount];

도움이 될 것입니다.


KeychainItemWrapper (ARC 버전)를 사용하는 것을 보았지만 원하는 Objective C 래퍼를 찾지 못했습니다.

내가 사용하는 이 솔루션 에 의해 키시 카와 카츠미 내가 적은 코드를 작성하고있는 NSString 값을 저장하기 위해 캐스트를 사용하지 않은 의미.

저장의 두 가지 예 :

[UICKeyChainStore setString:@"kishikawakatsumi" forKey:@"username"];
[UICKeyChainStore setString:@"P455_w0rd$1$G$Z$" forKey:@"password"];

검색의 두 가지 예

UICKeyChainStore *store = [UICKeyChainStore keyChainStore];
    // or
UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"YOUR_SERVICE"];

NSString *username = [store stringForKey:@"username"];
NSString *password = [store stringForKey:@"password"];

위의 코드에는 작은 버그가 있습니다 (Dave가 귀하의 게시물에 감사하는 데 매우 도움이되었습니다)

자격 증명을 저장하는 부분에서 제대로 작동하려면 다음 코드도 필요합니다.

[self.keychainItem setObject:@"myCredentials" forKey:(__bridge id)(kSecAttrService)];

아마도 두 번째로 키 체인 항목에 이미 할당 된 것과 동일한 자격 증명으로 다시 로그인하려고 시도 할 때 앱이 충돌하기 때문일 수 있습니다. 위의 코드를 사용하면 매력처럼 작동합니다.


이 질문을 업데이트하려면

Swift 체크 아웃을 사용하는 사용자를 위해 액세스 그룹을 지원하는 Mihai Costea의이 드래그 앤 드롭 신속한 구현

https://github.com/macostea/KeychainItemWrapper.swift/blob/master/KeychainItemWrapper.swift

키 체인을 사용하기 전에 : 비밀번호를 저장하기 전에 두 번 고려하십시오. 인증 토큰 (예 : 지속성 세션 ID)과 전자 메일 또는 계정 이름을 저장하면 충분할 수 있습니다. 인증 토큰을 쉽게 무효화하여 무단 액세스를 차단할 수 있습니다. 사용자는 손상된 장치에서 다시 로그인해야하지만 암호 재설정이 필요하지 않고 모든 장치에서 다시 로그인해야합니다 (우리는 Apple을 사용하고 있습니까?).


그러나 이제 키 체인 래퍼 대신 NURLCredential을 사용할 수 있습니다. 우리가해야 할 일을합니다.


신속하게이 라이브러리를 사용할 수 있습니다.

https://github.com/jrendel/SwiftKeychainWrapper

그것은 모든 버전의 스위프트를 지원합니다.


다음은 잘 작동합니다.

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];
[keychainItem setObject:@"password you are saving" forKey:kSecValueData]; 
[keychainItem setObject:@"username you are saving" forKey:kSecAttrAccount];

참고 URL : https://stackoverflow.com/questions/6972092/ios-how-to-store-username-password-within-an-app

반응형