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.h
및 SSKeychainQuery.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
'IT' 카테고리의 다른 글
웹 사이트와 웹 응용 프로그램의 차이점은 무엇입니까? (0) | 2020.03.25 |
---|---|
JavaLaunchHelper 클래스는 두 곳에서 구현됩니다. (0) | 2020.03.25 |
파이썬의 스레드에서 반환 값을 얻는 방법은 무엇입니까? (0) | 2020.03.25 |
TypeScript에서 객체 리터럴의 유형 정의 (0) | 2020.03.25 |
SQL Server-INSERT 후 반환 값 (0) | 2020.03.25 |