iOS用户数据安全:Keychain、Touch ID以及1Password
IOS编码安全规范

移动端-IOS编码安全规范一、命名1、Bundle id命名:规则:采用反域名命名规则,所有使用小写字母。
一级包名为com,二级包名根据应用进行命名。
2、类命名:1)类命采用驼峰命名规则,即首字母必须大写,假如为词组,则每个单词的首字母必须大写,类名只能使用名词或名词词组,力求类名简朴,不允许出现冗余的单词。
2)继承自UIView的类以View结尾。
3)继承自ViewController的类以ViewController结尾。
4)保存数据的实体以Model结尾。
3、方法的命名:规则:方法名第一个单词是一个动词,其首字母小写,其后的所有单词首字母大写。
如:public Void threadRun()1)类中常用方法命名:类的获取方法假如返回值为单个值,一般在头部加上单词“get”。
假如返回值是数组或列表,要在头部加单词“find”如:public String getUserName() 、public list<String> findFriends() ●类的设立方法在被访问字段名的前面加上前缀 set如:public void setName(String name)●类的布尔型判断方法一般规定方法名使用单词 is或has 做前缀如:isNetWorkConnected()●构造方法应当用递增的方式写。
参数个数少的在前4、变量命名规则:第一个单词首字母必须小写,往后的单词需要符合驼峰命名规则,即第一个字母大写。
变量名尽也许的使用名词或名词词组。
同样规定简朴易懂,不允许出现无意义的单词。
如:String userName避免使用全局变量,假如用到必须加前缀‘ Pub_’,同时需要在变量名体现其类型。
5、成员变量命名与变量命名同样,在private字段前加上字母“m”。
6、控件变量命名规则:一般的变量命名后加上控件名称IBOutlet UILabel *userNameLabel;7、常量命名:规则:必须所有大写,单词间用下划线隔开。
iOS之keychain详解(附有Demo)

iOS之keychain详解(附有Demo)iOS keychain是苹果⽤来保存⽤户私密数据的⼀个专业的SQLite数据库。
保存的数据主要是⼀些轻量级的私密数据,⽐如⽤户密码,token(令牌)等,保存在这个数据库中的密码不会因为你卸载了app就不见了,只要你重新安装app。
调⽤相关的服务、账户API就能得到app上次保存在数据库中的密码。
这对于⽤户卸载app之后⼜重新安装但是却忘记了密码的情况很适⽤。
有⼀点很奇怪,经测试,不同的开发者账号访问同⼀服务同⼀账号下的密钥的时候竟然都能获取得到,这样岂不是会有冲突。
希望有知道原因的⼩伙伴们在评论中留⾔,解答⼀下俺⼼中的疑问╮(~▽~)╭iOS keychain共有5种类型: kSecClassGenericPassword、kSecClassInternetPassword、kSecClassCertificate、kSecClassKey、kSecClassIdentity这五种类型分别有不同的属性,你可以理解为数据中5个不同的表,他们有各⾃对应的字段,因此对应的它们的增删改查其实有点类似于sql语句的操作,下⾯是不同类型对应的属性:现在以kSecClassGenericPassword(⼀般的密码)为例:增加keychain//新增keychain- (void)addKeychainPassword{NSDictionary *query = @{(__bridge id)kSecAttrAccessible:(__bridge id)kSecAttrAccessibleWhenUnlocked,(__bridge id)kSecClass:(__bridge id)kSecClassGenericPassword,(__bridge id)kSecValueData:[@"123456" dataUsingEncoding:NSUTF8 /*参数⼀:kSecAttrAccessibleWhenUnlocked 表⽰获取当前密钥只要屏幕处于解锁状态就可以了kSecAttrAccessibleAfterFirstUnlock 表⽰⼿机第⼀次解锁就可以获取当前密钥kSecAttrAccessibleAlways 表⽰任何时候都可以获取当前密钥kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly 表⽰获取密钥只能在当前设备,把⼿机数据恢复到新的⼿机中是不可⽤的kSecAttrAccessibleWhenUnlockedThisDeviceOnly ⾮锁定状态,且设备唯⼀指定,同上kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly 第⼀次解锁,且设备唯⼀指定,同上kSecAttrAccessibleAlwaysThisDeviceOnly 总是可以获取,当然也是设备唯⼀指定,同上参数⼆:kSecClassGenericPassword 为keychain类型参数三:kSecValueData 存储的数据,就是密码、token存储的地⽅,要转化为NSData类型参数四:kSecAttrAccount 为账户名作为账户密码的唯⼀索引参数五:kSecAttrService 为服务名作为账户密码的唯⼀索引*/CFTypeRef result;OSStatus status = SecItemAdd((__bridge CFDictionaryRef)query, &result);if (status == errSecSuccess) {NSLog(@"添加成功");}else{NSLog(@"添加失败");}}查询keychain://查询keychain- (void)queryKeychainPassword{NSDictionary *query = @{(__bridge id)kSecClass:(__bridge id)kSecClassGenericPassword,(__bridge id)kSecReturnData:@YES,(__bridge id)kSecMatchLimit:(__bridge id)kSecMatchLimitOne,(__bridge id)kSecAttrAccount:@"account name",(__bridge id)kSecAttrService:@"loginPassword"};//kSecMatchLimitOne 表⽰查询返回⼀条记录,有可能查到多条记录,⼀般默认返回⼀条记录//kSecMatchLimitAll 表⽰返回所有记录//SecItemCopyMatching函数会根据query⾥⾯的查询条件查找对应符合要求的记录,另外根据不同的keychain类型dataTypeRef会返回对应的不同类型如NSArray、NSDictionary、NSDataCFTypeRef dataTypeRef = NULL;OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &dataTypeRef);if (status == errSecSuccess) {NSString *pwd = [[NSString alloc]initWithData:(__bridge NSData*)dataTypeRef encoding:NSUTF8StringEncoding];NSLog(@"pwd:%@",pwd);}}查询keychain对应的属性://另外可以通过kSecReturnRef查询其他属性,相对于前⾯的返回密钥的引⽤,kSecReturnRef返回的是keychain所有的属性- (void)queryMoreAttribute{NSDictionary *query = @{(__bridge id)kSecClass:(__bridge id)kSecClassGenericPassword,(__bridge id)kSecReturnRef:@YES,(__bridge id)kSecReturnData:@YES,(__bridge id)kSecMatchLimit:(__bridge id)kSecMatchLimitOne,(__bridge id)kSecAttrAccount:@"account name",(__bridge id)kSecAttrService:@"loginPassword"};CFTypeRef dataTypeRef = NULL;//重点是(__bridge id)kSecReturnRef:@YES,声明返回的数据是整个keychain的所有属性OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &dataTypeRef);if (status == errSecSuccess) {NSDictionary *dict = (__bridge NSDictionary *)dataTypeRef;NSString *acccount = dict[(id)kSecAttrAccount];NSLog(@"acccount:%@",acccount);NSData *data = dict[(id)kSecValueData];NSString *pwd = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];NSLog(@"pwd:%@",pwd);NSString *service = dict[(id)kSecAttrService];NSLog(@"service==result:%@", service);}}更新keychain://修改keychain- (void)changeKeychainPassword{NSDictionary *query = @{(__bridge id)kSecClass:(__bridge id)kSecClassGenericPassword,(__bridge id)kSecAttrService:@"loginPassword",(__bridge id)kSecAttrAccount:@"account name"};NSDictionary *update = @{(__bridge id)kSecValueData:[@"654321" dataUsingEncoding:NSUTF8StringEncoding]};OSStatus status = SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)update);if (status == errSecSuccess) {NSLog(@"更新成功");}}删除keychain://删除keychain- (void)deleteKeychainPassword{NSDictionary *query = @{(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,(__bridge id)kSecAttrService : @"loginPassword",(__bridge id)kSecAttrAccount : @"account name"};//尽量详细的添加多个属性,避免误删其他keychainOSStatus status = SecItemDelete((__bridge CFDictionaryRef)query);if (status == errSecSuccess) {NSLog(@"成功删除");}}iOS keychain有⼀个特⾊功能就是keychainsharing,它能实现多个同⼀个开发者账号下的多个应⽤共享keychain,前提是要开启keychainsharing功能,如下图所⽰:可以在keychainsharing中对应的分组,把keychain添加的到分组的操作可以这样写//sharing Items//添加sharing Items- (void)addSharingItems{NSDictionary *query = @{(__bridge id)kSecAttrAccessible : (__bridge id)kSecAttrAccessibleWhenUnlocked,(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,(__bridge id)kSecValueData : [@"88888888" dataUsingEncoding:NSUTF8StringEncoding],(__bridge id)kSecAttrAccount : @"account name",(__bridge id)kSecAttrAccessGroup : @".mycom.iOS-keychain",(__bridge id)kSecAttrService : @"loginPassword",(__bridge id)kSecAttrSynchronizable : @YES,};/*(__bridge id)kSecAttrSynchronizable : @YES 表⽰可以同步到icloud,如果要同步到其他设备,请注意避免使⽤DeviceOnly设置等其他和设备唯⼀性相关的设置*/OSStatus status = SecItemAdd((__bridge CFDictionaryRef)query, nil);if (status == errSecSuccess) {NSLog(@"sharing Items添加成功");}else{NSLog(@"sharing Items添加失败");}}查询对应的分组//查询sharing Items- (void)querySharingItems{NSDictionary *query = @{(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,(__bridge id)kSecReturnRef : @YES,(__bridge id)kSecReturnData : @YES,(__bridge id)kSecMatchLimit : (__bridge id)kSecMatchLimitAll,(__bridge id)kSecAttrAccount : @"account name",(__bridge id)kSecAttrAccessGroup : @".mycom.iOS-keychain",(__bridge id)kSecAttrService : @"loginPassword",};CFTypeRef dataTypeRef = NULL;OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &dataTypeRef);if (status == errSecSuccess) {NSLog(@"sharing Items查询成功");}else{NSLog(@"sharing Items查询失败");}}和对单个keychain进⾏操作不同的是添加多了⼀个kSecAttrAccessGroup属性,⽤于指明对应的分组,这⾥要注意的是要添加开发者账号的teamId,⽤于区分不同的开发者。
iOS应用中的数据加密与保护技术指南(八)

iOS应用中的数据加密与保护技术指南随着智能手机的普及和移动应用的高速发展,人们的生活变得越来越便利。
然而,随之而来的是对个人信息和数据安全的担忧。
为了保护用户的隐私和敏感数据不受到侵犯,数据加密和保护成为iOS应用开发中的重要议题。
本文将探讨iOS应用中的数据加密与保护技术。
I. 介绍在iOS应用开发中,数据加密和保护是保障用户隐私和数据安全的关键环节。
无论是用户的个人信息,还是敏感数据,如密码和银行账户信息,都需要得到有效的加密和保护。
II. 数据加密技术1. 对称加密对称加密是将数据使用相同的密钥进行加密和解密的方法。
在iOS应用中,常用的对称加密算法有AES(Advanced Encryption Standard)。
AES是一种可靠且高效的加密算法,已被广泛应用于数据保护领域。
2. 非对称加密非对称加密是使用不同的密钥进行加密和解密的方法,其中公钥用于加密,私钥用于解密。
RSA(Rivest-Shamir-Adleman)是一种常用的非对称加密算法,它可以提供更强的安全性。
III. 数据保护技术1. 数据层加密数据层加密是指对存储在设备上的数据进行加密操作。
iOS提供了一种叫做Data Protection的功能,它可以通过使用设备的硬件加密引擎来保护数据。
开发者可以通过设置合适的保护级别,确保敏感数据在设备上存储时得到适当的保护。
2. 传输层加密为了保护在网络上传输的数据,开发者可以使用SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议来加密通信。
这样可以防止中间人攻击和数据被窃听。
IV. 加密密钥管理在iOS应用中,密钥的管理是非常重要的。
开发者应该使用安全的方法来存储和管理密钥,以防止密钥被泄露或者被非法使用。
1. 密钥存储开发者可以使用iOS的Keychain服务来安全地存储密钥。
Keychain是一个专门用于存储敏感数据的安全容器。
keychains and provisioning profiles management

keychains and provisioning profiles management关于Keychains和Provisioning Profiles管理的文档对于iOS开发者来说,Keychains和Provisioning Profiles是不可或缺的组成部分。
Keychains是iOS系统中的一个安全存储器,用于存储敏感数据,如密码和证书等。
而Provisioning Profiles则是开发者建立与苹果服务器和设备之间信任的桥梁,以便可以将开发者的应用程序部署到目标设备上。
在本文中,我们将会讨论Keychains 和Provisioning Profiles的作用以及如何管理它们,以确保您的应用程序的安全可靠。
Keychains管理Keychains是保护您应用程序重要信息的重要部分,因此,如果不恰当地管理Keychains,则可能会导致安全隐患。
当您存储密码或敏感数据时,使用Keychain是最佳方式。
下面是一些关于Keychains管理的最佳实践:1. 避免硬编码敏感数据避免将敏感信息硬编码在您的应用程序中,如密码,证书等。
相反,您应该使用Keychain库将这些信息存储在Keychain中。
2. 加密键和密码除了存储数据以外,Keychains还允许您生成安全键和随机密码。
这样可以确保安全性并抵御黑客攻击,因为他们无法破解加密密钥和密码。
3. 确保合适的访问权限如果您只需要读取Keychain中的数据,则应该为只读权限设置Keychain,而不是使用完全访问权限。
这可以提高安全性,并确保仅有授权的用户才能访问数据。
4. 不要滥用Keychain仅在需要的情况下使用Keychain。
过度使用Keychain 可能导致您的应用程序被攻击,因为黑客可以使用存储在Keychain中的数据来攻击您的应用程序。
Provisioning Profiles管理Provisioning Profiles是iOS开发中的必要组件,它允许您将应用程序部署到目标设备上。
苹果隐私及应用加密

苹果隐私及应用加密苹果一直以来都保持着在隐私保护方面的高标准。
从硬件到软件,苹果都采取了多重的技术措施来保护用户的隐私。
以下是一些苹果隐私及应用加密的相关知识。
硬件方面:1. 相机和麦克风硬件断电:所有新款苹果设备都在硬件级别上增加了相机和麦克风硬件断电保护,确保在不需要使用相机和麦克风时,它们将完全断电,以防止黑客通过这些硬件植入恶意软件进行监听。
2. Touch ID或Face ID:苹果的Touch ID 或Face ID 技术不仅用于设备登录,还可以保护用户的敏感数据和支付信息。
这些生物识别技术只在您认证的情况下才会进行解锁和授权。
软件方面:1. 数据加密:苹果的操作系统在存储用户数据时都采用端到端加密,随时保证用户数据的安全,甚至在数据备份到iCloud 时也是如此。
加密是指将数据转换为特定算法后,就算被第三方窃取,也无法查看数据内容。
只有在输入正确的密码后,才能解密,并获得数据的内容。
2. 应用数据隐私控制:在苹果设备上运行的应用需要获取您的许可才能访问您的个人数据,例如通讯录、相册或地理位置。
应用只有通过用户授权,才可以获取这些个人数据。
此外,在iOS 14 中,苹果引入了标签,可以显示哪些应用已经访问了哪些数据。
这个标签系统使用户更容易了解自己在使用哪些应用时共享了什么数据,从而进一步保护用户的隐私。
3. 无法跟踪广告位标识符(IDFA):IDFA是一种用于广告跟踪的唯一标识符。
在iOS 14 中,苹果引入了应用内请求跟踪(App Tracking Transparency, ATT) 功能来强制让应用请求许可才能使用IDFA标识符。
这个功能可以帮助限制广告跟踪和数据共享,增强用户的隐私权。
总结:苹果在隐私保护方面一直秉承严格的标准,不断地改进技术,特别是在硬件方面,采用相机和麦克风硬件断电、Touch ID或Face ID 生物识别技术等,进一步保障用户的隐私安全。
在软件方面,苹果的端到端加密、应用数据隐私控制和无法跟踪广告位标识符(IDFA)等技术,也进一步提高了用户数据的私密性和安全性。
1PASSWORD使用教程

1Password是一款功能很强大的密码管理软件,最初只有OS X版本,用户存入1Password 的敏感信息会使用一个主密码加密,这意味着除了知道主密码,想要破解1Password的数据文件还是需要很长时间的。
1Password将数据储存在本地,这样保证用户的安全。
除了密码管理外,1Password还支持管理各种敏感信息,比如银行卡信息、身份证、信用卡、驾照和护照等。
此外,1Password的密码生成功能也非常好用,可以自动为每个网站生成独立复杂的密码,并通过云服务同步至用户的各种设备上。
当苹果推出iCloud钥匙串后,Mac和iOS 平台上的Safari浏览器可以同步用户和密码信息。
这也让1Password感受到了威胁,不久之前,iOS平台上的1Password应用开始免费提供。
对于拥有大量密码的用户来说,1Password 仍然是一款非常好用的密码和敏感信息管理软件,值得推荐与体验。
如果之前没有在OS X系统或其他平台上使用过1Password,第一次运行1Password时可以按照提示创建数据库,选择最重要的主密码。
完成后可以选择同步方式,推荐大家使用iCloud,因为Dropbox在国内已经无法使用。
每次运行1Password时,可以看到上图的启动界面,1Password的图标也是经过了很久的改进,才最终进化成为iOS 8专门扁平优化的外观。
我们输入主密码后,会有非常不错的解锁动画,并进入1Password主界面查看和录入密码信息了。
对于密码和敏感信息管理来说,最重要的一步就是将所有信息录入应用。
1Password支持多种类别,包括网站登录信息、安全备注、信用卡、身份标识、密码、驾照等。
任意界面点击右上角的+号可以进入新项目创建功能,选择类别后,在相应的空白处填好信息后点击右上角的完成即可。
需要密码的项目可以使用1Password内置的复杂密码生成器实现,我们只需选择密码长度即可。
完成大量项目录入后,就需要更多的管理方式浏览或使用这些信息。
iOS用户数据安全:Keychain、Touch ID以及1Password

本文由cocoaChina翻译小组成员YueWang(博客)翻译自Raywenderlich。
原文:Securing iOS User Data: The Keychain, Touch ID, and 1Password使用登录界面来保护APP用户数据是很好的方法--你可以使用Keychain(内嵌在iOS里的)来确保用户数据的安全。
不过苹果现在使用Touch ID提供了另外一层保护,该功能适用于iPhone5、iPhone6、iPhone 6+、iPad Air2以及iPad mini 3。
如果这些都还不够,可以尝试iOS 8引入的扩展,你甚至可以使用AgileBits开发的1Password app来整合登录信息的存储和获取。
这一切都要感谢AgileBits 团队开发者开源了他们的扩展包。
这样你就可以把管理登录信息的责任交给Keychain、TouchID或者1Password。
在这个教程中,我们将使用Keychain 来存储和验证登录信息。
之后,我们会学习Touch ID,最后将1Password 扩展集成到你的app中。
注意:Touch ID和1Password要求在真机上测试,Keychain可以在模拟器上测试。
开始请在此下载该教程的初始工程文件。
这是一个最基本的使用Core Data存储用户笔记的记笔APP;storyboard中包含一个登录界面,用户可输入用户名和密码,这个APP的其他界面已经都关联好了,而且可以直接使用。
编译并运行工程,查看APP在当前状态下的展示情况:现在,点击Login按钮会关闭当前界面并展示笔记的列表-你也可以在该界面上创建一个新的笔记。
点击Logout会带你返回到Login界面。
如果这个APP处于后台,它会马上返回到login界面。
这种方式保障了在没有登录的情况下是看不到任何数据的。
将Info.plist里面的Application does not run in background设置为YES就可以达到这个效果。
Ios网络安全

Ios网络安全iOS网络安全是指对使用iOS系统的移动设备进行网络连接和数据传输过程中的安全保护措施。
随着智能手机和移动应用的普及,人们越来越依赖于移动设备进行各种在线操作,如在线购物、支付、社交媒体等。
因此,iOS网络安全的重要性也变得日益突出。
首先,iOS平台具有高度封闭性和安全性。
由于iOS是封闭的操作系统,只能从Apple App Store下载应用程序,而且Apple 对提交至App Store的应用有严格的审核程序。
这使得恶意软件和病毒很难通过App Store传播,从而有效保护用户的数据安全。
其次,iOS提供了多种安全机制来保护个人用户的隐私和数据安全。
例如,Touch ID和Face ID等生物识别技术可以提供高强度的身份验证,防止他人未经授权访问设备和个人信息。
另外,iOS系统中的加密技术可以对用户的数据进行加密存储和传输,确保数据在传输和存储过程中不被窃取或篡改。
此外,iOS系统提供的大量的安全设置和功能,可以帮助用户更好地保护设备和数据安全。
例如,用户可以设置自动锁屏、启用设备远程擦除功能以及使用强密码等来保护设备的安全。
此外,用户可以选择使用VPN等工具来加密网络连接,避免网络监听和数据泄露。
然而,iOS网络安全也存在一些潜在的问题。
首先,手机应用程序的权限管理问题。
有些应用会请求获取用户的敏感信息,如通讯录、照片等。
用户在使用应用时需要谨慎选择,并注意查看权限请求,避免不必要的权限授权。
其次,社交工程和网络钓鱼等技术也可能对用户的数据安全造成威胁。
用户需要提高警惕,不轻易点击可疑的链接和附件,避免被诈骗或攻击。
综上所述,iOS网络安全是移动设备用户必须关注的一个重要问题。
Apple的封闭性和安全性以及提供的多种安全机制和功能,为用户数据的保护提供了一定程度的保障。
然而,用户仍需自己对自己的设备和信息进行合理的设置和管理,提高安全意识,防范各种潜在的安全威胁。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文由cocoaChina翻译小组成员YueWang(博客)翻译自Raywenderlich。
原文:Securing iOS User Data: The Keychain, Touch ID, and 1Password使用登录界面来保护APP用户数据是很好的方法--你可以使用Keychain(内嵌在iOS里的)来确保用户数据的安全。
不过苹果现在使用Touch ID提供了另外一层保护,该功能适用于iPhone5、iPhone6、iPhone 6+、iPad Air2以及iPad mini 3。
如果这些都还不够,可以尝试iOS 8引入的扩展,你甚至可以使用AgileBits开发的1Password app来整合登录信息的存储和获取。
这一切都要感谢AgileBits 团队开发者开源了他们的扩展包。
这样你就可以把管理登录信息的责任交给Keychain、TouchID或者1Password。
在这个教程中,我们将使用Keychain 来存储和验证登录信息。
之后,我们会学习Touch ID,最后将1Password 扩展集成到你的app中。
注意:Touch ID和1Password要求在真机上测试,Keychain可以在模拟器上测试。
开始请在此下载该教程的初始工程文件。
这是一个最基本的使用Core Data存储用户笔记的记笔APP;storyboard中包含一个登录界面,用户可输入用户名和密码,这个APP的其他界面已经都关联好了,而且可以直接使用。
编译并运行工程,查看APP在当前状态下的展示情况:现在,点击Login按钮会关闭当前界面并展示笔记的列表-你也可以在该界面上创建一个新的笔记。
点击Logout会带你返回到Login界面。
如果这个APP处于后台,它会马上返回到login界面。
这种方式保障了在没有登录的情况下是看不到任何数据的。
将Info.plist里面的Application does not run in background设置为YES就可以达到这个效果。
开始之前,更改Bundle Identifier,选择一个合适的Team。
在工程导航器中选中TouchMeIn,然后选择TouchMeIn target。
在General 标签中更改Bundle Identifier为你自己的域名-使用反向域名构造标识符规则-例如com.raywenderich.TouchMeIn.然后,如下,在Team菜单上选择你的开发团队相应的账户。
所有配置齐全后,开始coding吧!:] Logging? Log In.话不多说,开始吧!现在你要增加功能来对照用户提供的验证信息和硬编码的值。
打开LoginViewController.swift,在managedObjectContext变量声明的下方添加下面的常量:letusernameKey=“batman”letpasswordK ey=“HelloBruce!”以上是仅仅是硬编码用户名和密码,用来核对用户提供的验证信息。
在loginAction(_:)下方添加以下函数:funccheckLogin(username:String,passwo rd:String)->Bool{if((username==username Key)&&(password==passwordKey)){return true}else{returnfalse}}该方法查看用户提供的验证信息与你提前定义的常量是否匹配。
接下来,将loginAction(_:) 里的内容替换为如下内容:if(checkLogin(ernameTextField.text ,password:self.passwordTextField.text)){se lf.performSegueWithIdentifier(“dismissLo gin”,sender:self)}该方法调用了checkLogin(_:password:)方法,如果验证信息正确则收起登录界面。
编译并运行程序,输入用户名batman 和密码Hello Bruce!,点击Login按钮,登录界面应该按照预期被收起。
尽管这个做法可以达到验证效果,但是非常不安全,因为以字符串形式保存验证信息能被训练有素的黑客使用正确的工具轻松获取。
最好的策略是,永远不要将密码直接保存在app里。
为此,你应该使用Keychain 来保存密码。
查看Chris Lowe的Basic Security in iOS 5--Part 1教程来学习Keychain 的实际工作原理。
下一步将Keychain封装添加到你的APP。
虽然它是用Objective-C写的,但也要添加一个bridging header头文件,以便从Swift中访问Objective-C类。
Rapper? No. Wrapper.你可以在此下载KeychainWrapper,来自于苹果的Keychain Services Programming Guide.下载解压后,将KeychainWrapper.h 和KeychainWrapper.m拖进你的工程里,如下所示:在弹出窗口中,选中Copy items if needed 和TouchMeIn target。
在Swift工程中添加Objective-C文件,Xcode会为你创建一个桥接头文件-点击Yes:这时候创建了一个名为TouchMeIn-Bridging-Header.h的桥接头文件。
将所有Objective-C文件的头文件添加到文件中,以便Swift工程可以访问得到。
想要检查桥接头文件设置是否正确,在工程导航器中选择TouchMeIn。
选中Build Settings,在搜索栏中输Swift Compiler,然后找到Objective-C Bridging Header栏,当前栏中包含TouchMeIn/TouchMeIn-Bridging-Header.h 如下图所示:提示:你可以在Porting Your App to the iPhone 6, iPhone 6 Plus and iOS 8: Top 10Tips(中文译文)中了解更多关于桥接头文件的信息。
想了解更多Swift和Objective-C混编的信息,可以查看苹果的Using Swift with Cocoa and Objective-C 指南.打开TouchMeIn-Bridging-Header.h文件,在文件开头导入Keychain 封装包:#import”KeychainWrapper.h”编译并运行工程,以确保没有任何错误。
一切正常?很好—现在你可以在APP中发挥Keychain的优势了。
提示:如果工程中存在错误,请查看苹果的Using Swift with Cocoa and Objective-C指南来修复错误。
Keychain, Meet Password. Password, Meet Keychain想使用Keychain,必须先保存一个用户名和密码。
然后检查用户提供的验证信息和keychain里面保存的信息是否匹配。
你应该追踪用户是否已经创建了验证信息,以便你可以把login按钮的展示文字从“Create”更改为“Login”。
你也应该存储用户名到user defaults当中,以便检查验证信息是否创建,而不是每次都访问keychain。
打开LoginViewController.swift文件然后删掉以下内容:let usernameKey = “batman”let passwordKey = “Hello Bruce!”在以上删除掉的地方添加下面的内容:letMyKeychainWrapper=KeychainWrapp er()letcreateLoginButtonTag=0letloginButt onTag=1@IBOutletweakvarloginButton:UI Button!MyKeychainWrapper保留了到Objective-C KeychainWrapper类的引用。
接下来的两个常量会用来区分Login按钮到底是用来创建验证信息还是用来登录;根据前面的两个状态(创建或登录),LoginButton outlet用来更新login 按钮的展示文字。
打开Main.storyboard,然后从Login View Controller里执行Ctrl-drag操作,拖拉到Login按钮,如图所示:在弹出框里选择loginButton接下来,当按钮被轻触时,你要处理两种可能情况:如果用户还没有创建过验证信息时,按钮文字应该展示“Create,否则按钮展示“Login”。
你也需要检查输入的验证信息和keychain保存的信息是否匹配。
打开LoginViewController.swift,将loginAction(_:) 里面的代码替换为如下内容:@IBActionfuncloginAction(sender:AnyOb ject){//1.if(usernameTextField.text==““||p asswordTextField.text==““){varalert=UIAle rtView()alert.title=“Youmustenterbothaus ernameandpassword!”alert.addButtonWit hTitle(“Oops!”)alert.show()return;}//e rnameTextField.resignFirstResponder()pas swordTextField.resignFirstResponder()//3.i fsender.tag==createLoginButtonTag{//4.let hasLoginKey=NSUserDefaults.standardUse rDefaults().boolForKey(“hasLoginKey”)ifhasLoginKey==false{NSUserDefaults.standar dUserDefaults().setValue(ernameTe xtField.text,forKey:”username”)}//5.MyKe ychainWrapper.mySetObject(passwordTex tField.text,forKey:kSecValueData)MyKeych ainWrapper.writeToKeychain()NSUserDefa ults.standardUserDefaults().setBool(true,f orKey:”hasLoginKey”)NSUserDefaults.stan dardUserDefaults().synchronize()loginButt on.tag=loginButtonTagperformSegueWithI dentifier(“dismissLogin”,sender:self)}elseif sender.tag==loginButtonTag{//6.ifcheckLog in(usernameTextField.text,password:pass wordTextField.text){performSegueWithIde ntifier(“dismissLogin”,sender:self)}else{//7. varalert=UIAlertView()alert.title=“LoginPr oblem”alert.message=“Wrongusernameor password.”alert.addButtonWithTitle(“Foil edAgain!”)alert.show()}}}上述代码分析:代码里发生了如下步骤:如果用户名或密码为空,则弹出一个提示框并从该方法返回。