zoukankan      html  css  js  c++  java
  • IOS开发之----两种保存用户名和密码实现记住密码库

    使用Keychain存储用户敏感信息

    iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个ios程序都有一个独立的keychain存储。相对于 NSUserDefaults、文件保存等一般方式,keychain保存更为安全,而且keychain里保存的信息不会因App被删除而丢失,所以在 重装App后,keychain里的数据还能使用。从ios 3。0开始,跨程序分享keychain变得可行。

    如何需要在应用里使用使用keyChain,我们需要导入Security.framework ,keychain的操作接口声明在头文件SecItem.h里。直接使用SecItem.h里方法操作keychain,需要写的代码较为复杂,为减轻咱们程序员的开发,我们可以使用一些已经封装好了的工具类,下面我会简单介绍下我用过的两个工具类:KeychainItemWrapper和SFHFKeychainUtils。

    KeychainItemWrapper (下载)

    KeychainItemWrapper是apple官方例子“GenericKeychain”里一个访问keychain常用操作的封装类,在官网上下载了GenericKeychain项目后,只需要把“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷贝到我们项目,并导入Security.framework 。KeychainItemWrapper的用法:

     
    1.   
    2. KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number"    
    3.                                                                    accessGroup:@"YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier"];   
    4.   
    5. //保存帐号   
    6. [wrapper setObject:@"<帐号>" forKey:(id)kSecAttrAccount];     
    7.        
    8. //保存密码   
    9. [wrapper setObject:@"<帐号密码>" forKey:(id)kSecValueData];     
    10.        
    11. //从keychain里取出帐号密码   
    12. NSString *password = [wrapper objectForKey:(id)kSecValueData];       
    13.   
    14. //清空设置   
    15. [wrapper resetKeychainItem];   

    另外需要引入Security.framework 和KeychainItemWrapper头文件

    其中方法“- (void)setObject:(id)inObject forKey:(id)key;”里参数“forKey”的值应该是Security.framework 里头文件“SecItem.h”里定义好的key,用其他字符串做key程序会崩溃!

     

    SFHFKeychainUtils(下载)

    SFHFKeychainUtils是另一个封装了KeyChain简单操作的第三方类库,使用上比KeychainItemWrapper要简单点,SFHFKeychainUtils只提供了获取、保存和删除三个方法:

    1. #import    
    2.   
    3. @interface SFHFKeychainUtils : NSObject {   
    4.        
    5. }   
    6.   
    7.   
    8. + (NSString *) getPasswordForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error;   
    9.   
    10.   
    11. + (BOOL) storeUsername: (NSString *) username andPassword: (NSString *) password forServiceName: (NSString *) serviceName updateExisting: (BOOL) updateExisting error: (NSError **) error;   
    12.   
    13.   
    14. + (BOOL) deleteItemForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error;   
    15.   
    16. @end  
     

    使用方法:

    1. #define ServiceName @"com.mycompany.yourAppServiceName"   
    2.   
    3. NSError *error;   
    4. NSString *userName = @"<用户名>";   
    5. NSString *password = @"<用户密码>";   
    6.        
    7.   
    8. BOOL saved = [SFHFKeychainUtils storeUsername:userName   
    9.                                   andPassword:password    
    10.                                forServiceName:ServiceName    
    11.                                updateExisting:YES    
    12.                                      error:&error ];   
    13. if (!saved) {   
    14.     NSLog(@"保存密码时出错:%@", error);   
    15. }   
    16.        
    17. error = nil;   
    18. NSString *thePassword = [SFHFKeychainUtils getPasswordForUsername:userName    
    19.                                                    andServiceName:ServiceName    
    20.                                                             error:&error];   
    21. if(error){   
    22.     NSLog(@"从Keychain里获取密码出错:%@", error);   
    23. }   

     

    SSKeyChains对苹果安全框架API进行了简单封装,支持对存储在钥匙串中密码、 账户进行访问,包括读取、删除和设置。

    https://github.com/soffes/sskeychain

    http://netmera.com/netmera-resources/doc/ios/v_1.5.1/Classes/SSKeychain.html#overview

  • 相关阅读:
    zoj 1239 Hanoi Tower Troubles Again!
    zoj 1221 Risk
    uva 10192 Vacation
    uva 10066 The Twin Towers
    uva 531 Compromise
    uva 103 Stacking Boxes
    稳定婚姻模型
    Ants UVA
    Golden Tiger Claw UVA
    关于upper、lower bound 的探讨
  • 原文地址:https://www.cnblogs.com/lisa090818/p/3940961.html
Copyright © 2011-2022 走看看