use - what is keychain ios




iOS: como armazenar nome de usuário/senha em um aplicativo? (10)

Eu decidi responder como usar o keychain no iOS 8 usando Obj-C e ARC.

1) Eu usei o keychainItemWrapper (versão ARCifief) do GIST: https://gist.github.com/dhoerl/1170641/download - Adicione (+ copie) o KeychainItemWrapper.h e .m ao seu projeto

2) Adicione a estrutura de segurança ao seu projeto (verifique no projeto> Fases de construção> Link binário com bibliotecas)

3) Adicione a biblioteca de segurança (#import) e KeychainItemWrapper (#import "KeychainItemWrapper.h") ao arquivo .h e .m onde deseja usar o keychain.

4) Para salvar dados no keychain:

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) Leia dados (provavelmente tela de login no carregamento> 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;

Apreciar!

Eu tenho uma tela de login no meu aplicativo iOS. O nome de usuário e a senha serão salvos no NSUserDefaults e carregados na tela de login novamente quando você entrar no aplicativo novamente (é claro que os NSUserDefaults são permanentes).

Agora, o usuário tem a possibilidade de desativar o recurso de salvamento de nome de usuário / senha.

Então os NSUserDefaults serão apagados então.

Mas no meu aplicativo eu preciso deste nome de usuário / senha para consultas de banco de dados para o usuário. Então: Onde armazenar os dados, exceto NSUserDefaults ? (Este local pode / deve ser excluído quando o usuário sair do aplicativo ou sair).


Eu olhei para o uso de KeychainItemWrapper (a versão ARC), mas não achei o wrapper Objective C tão completo quanto desejado.

Eu usei essa solução por Kishikawa Katsumi , o que significava que eu escrevia menos código e não tinha que usar elencos para armazenar valores NSString.

Dois exemplos de armazenamento:

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

Dois exemplos de recuperação

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

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

Mas, agora você pode ir para NURLCredential em vez de invólucro keychain. Faz o que precisamos fazer.


O seguinte deve funcionar bem:

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


Se você está tendo um problema ao recuperar a senha usando o wrapper keychain, use este código:

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

Uma solução muito fácil via Keychains .

É um invólucro simples para o sistema Keychain. Basta adicionar os SSKeychain.h , SSKeychain.m , SSKeychainQuery.h e SSKeychainQuery.m ao seu projeto e adicionar o Security.framework ao seu destino.

Para salvar uma senha:

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

Para recuperar uma senha:

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

Onde setPassword é o valor que você deseja salvar e forService é qual variável você deseja salvar em e conta é para qual usuário / objeto a senha e qualquer outra informação é para.


Você pode simplesmente usar NSURLCredential , ele salvará o nome de usuário e senha no keychain em apenas duas linhas de código .

Veja minha answer detalhada.


checkout este código de exemplo eu tentei primeiro invólucro da maçã a partir do código de exemplo, mas isso é muito mais simples para mim


tente este:

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

que isso ajude.





keychain