首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

iOS:iOS开发中用户密码保存位置

原文来自简书:http://www.jianshu.com/p/4af3b8179136/comments/1294203 如果要实现自动登录,不必每次打开应用都去登录,我们势必要把密码保存到本地。一般我们的操作是:每次打开应用后,如果存在密码,直接进入界面,然后再进行后台密码验证。如果没网络,我们可以跳过验证;如果有网络,我们可以后台去验证帐号密码的正确性,并根据服务器的response做一些操作。 为什么直接把密码存储在NSUserDefaults中不安全? iOS中沙盒有哪几个文件夹,都是用来干吗的 默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件 Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录 Library:存储程序的默认设置或其它状态信息; Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除 tmp:提供一个即时创建临时文件的地方。 获取到沙盒Library路径 //获取Library目录路径 - (void)getLibraryPath { NSArray * pathArray = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask, YES); NSString * libraryStrPath = [pathArray objectAtIndex:0]; NSLog(@"LibraryPath:%@“,libraryStrPath); } 如图就是NSUserDefaults对应的plist文件在sandbox中的位置 蓝色部分为plist文件 如果sandbox被破解,或者你的手机被越狱,那么就能轻松拿到这个文件。那么就能轻松读到存储的信息,密码就会不安全: 如何删除NSUserDefaults对应的plist文件? 其实就是删除plist文件中所有的键值对。 NSUserDefaults *userDefatluts = [NSUserDefaults standardUserDefaults]; NSDictionary *dictionary = [userDefaults dictionaryRepresentation]; for(NSString* key in [dictionary allKeys]){ [userDefaults removeObjectForKey:key]; [userDefaults synchronize]; } 如何解决“直接把密码存储在NSUserDefaults中不安全”的问题? 把密码加密后再存储到NSUserDefaults中 iOS中提供了很多种加密算法,对于存储密码,可以使用不可逆的MD5加密。使用MD5加密需要导入头文件:''#import <CommonCrypto/CommonDigest.h> ##### 简单的MD5加密 + ( NSString *)md5String:( NSString *)str { const char *myPasswd = [str UTF8String ]; unsigned char mdc[ 16 ]; CC_MD5 (myPasswd, ( CC_LONG ) strlen (myPasswd), mdc); NSMutableString *md5String = [ NSMutableString string ]; for ( int i = 0 ; i< 16 ; i++) { [md5String appendFormat : @"%02x" ,mdc[i]]; } return md5String; } ##### 复杂一些的MD5加密 + ( NSString *)md5String:( NSString *)str { const char *myPasswd = [str UTF8String ]; unsigned char mdc[ 16 ]; CC_MD5 (myPasswd, ( CC_LONG ) strlen (myPasswd), mdc); NSMutableString *md5String = [ NSMutableString string ]; [md5String appendFormat : @"%02x" ,mdc[ 0 ]]; for ( int i = 1 ; i< 16 ; i++) { [md5String appendFormat : @"%02x" ,mdc[i]^mdc[ 0 ]]; 不使用NSUserDefaults保存密码,使用keyChain来保存密码 更加保险的方法是把密码保存在iOS提供的keychina中,并且删除应用后,密码不会删除,下载安装还能使用。iOS系统提供了一些方法,进行一些简单的封装之后,就可以很方便的使用。 Github-chenhuaizhe-iOS-keychain你也可以在这里直接下载,更多交流可以关注我的微博:@陈怀哲 下面是封装代码,使用时需要先导入Security.framework: PassWordTool.h #import <Foundation/Foundation.h> @interface PassWordTool : NSObject /** * @brief 存储密码 * * @param password 密码内容 */ +(void)savePassWord:(NSString *)password; /** * @brief 读取密码 * * @return 密码内容 */ +(id)readPassWord; /** * @brief 删除密码数据 */ +(void)deletePassWord; @end PassWordTool.m import "PassWordTool.h" import "KeychainTool.h" @implementation PassWordTool static NSString * const KEY_IN_KEYCHAIN = @"com.chenyuan.app.userid"; static NSString * const KEY_PASSWORD = @"com.chenyuan.app.password"; +(void)savePassWord:(NSString *)password { NSMutableDictionary *usernamepasswordKVPairs = [NSMutableDictionary dictionary]; [usernamepasswordKVPairs setObject:password forKey:KEY_PASSWORD]; [KeychainTool save:KEY_IN_KEYCHAIN data:usernamepasswordKVPairs]; } +(id)readPassWord { NSMutableDictionary *usernamepasswordKVPair = (NSMutableDictionary *)[KeychainTool load:KEY_IN_KEYCHAIN]; return [usernamepasswordKVPair objectForKey:KEY_PASSWORD]; } +(void)deletePassWord { [KeychainTool delete:KEY_IN_KEYCHAIN]; } @end KeychainTool.h #import <Foundation/Foundation.h> @interface KeychainTool : NSObject + (NSMutableDictionary *)getKeychainQuery:(NSString *)service ; + (void)save:(NSString *)service data:(id)data ; + (id)load:(NSString *)service ; + (void)delete:(NSString *)service ; @end KeychainTool.m ``` # import "KeychainTool.h" @implementation KeychainTool + (NSMutableDictionary *)getKeychainQuery:(NSString *)service { return [NSMutableDictionary dictionaryWithObjectsAndKeys: (__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass, service, (__bridge_transfer id)kSecAttrService, service, (__bridge_transfer id)kSecAttrAccount, (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,(__bridge_transfer id)kSecAttrAccessible, nil]; } + (void)save:(NSString *)service data:(id)data { //Get search dictionary NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; //Delete old item before add new item SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery); //Add new object to search dictionary(Attention:the data format) [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData]; //Add item to keychain with the search dictionary SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL); } + (id)load:(NSString *)service { id ret = nil; NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; //Configure the search setting [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData]; [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit]; CFDataRef keyData = NULL; if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) { @try { ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData]; } @catch (NSException *e) { NSLog(@"Unarchive of %@ failed: %@", service, e); } @finally { } } return ret; } + (void)delete:(NSString *)service { NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery); } @end 服务器密码验证登录请求 验证请求时,最好是不直接把明文密码包含在请求里面。可以根据一系列字符串生成MD5加密后的签名,根据user-id 和 签名来验证登录。比如: NSString *sourceStr = [NSString stringWithFormat:@"attach=iOS&chartset=utf-8&format=json&partner=google&userid=%@&password=%@”,userid,password]; NSString *signStr = [NSString md5String:sourceStr]; 这样得到的signStr和userid再作为网络请求的参数传给服务器做验证。 其他参考: ios 利用钥匙串保存密码和获取密码 直接使用Security框架读写钥匙串,参考:http://useyourloaf.com/blog/2010/03/29/simple-iphone-keychain-access.html 我们使用第三方类SFHFKeychainUtils来操作钥匙串 (GitHub代码下载) 使用方法如下: 1、引入Security.framework框架。 2、引入头文件:#import"SFHFKeychainUtils.h" 3、存密码: NSString *SERVICE_NAME=@"demo"; [SFHFKeychainUtils storeUsername:@"dd" andPassword:@"aa" forServiceName:SERVICE_NAME updateExisting:1 error:nil]; 4、取密码: NSString *passWord = [SFHFKeychainUtils getPasswordForUsername:@"dd" andServiceName:SERVICE_NAME error:nil]; NSLog(@"%@",passWord); 5、删除用户: [SFHFKeychainUtils deleteItemForUsername:@"dd" andServiceName:SERVICE_NAME error:nil]; 程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式! 本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/5199935.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

ios开发学习--动画(Animation)效果源码分享

FTUtils 介绍: 实现各种各样的图形、动画效果。例子中展现的是各种各样视图出现和消失的例子,例如视图的淡入淡出、飞进飞出等等。 http://ios.itmdc.com/forum.php?mod=viewthread&tid=26&fromuid=15Snow Fall 介绍: 实现落雪的动画效果。 http://ios.itmdc.com/forum.php?mod=viewthread&tid=27Graphics Animation 介绍: 实现各种各样的图形、动画效果。例如图形变换、平移、渐变、缩放、旋转等等。 http://ios.itmdc.com/forum.php?mod=viewthread&tid=28Campfire 介绍: 实现火焰动画效果。其实作者是利用多张火焰图片,做成一个image sequence,然后播放这个sequence,从而产生动态的火焰效果。老实说,这不是一个很好的实现方法,仅仅比嵌入一段视频好一点,还不如直接加载一副GIF动画图片。 http://ios.itmdc.com/forum.php?mod=viewthread&tid=29Core Animation Demos 介绍: 实现各种各样的图形、动画效果。例如图形变换、平移、渐变、缩放、旋转、仪表盘、电子书翻页等等。 http://ios.itmdc.com/forum.php?mod=viewthread&tid=31&fromuid=15Animation Showcase 介绍: 实现各种各样的图形、动画效果。例如图形变换、平移、渐变、缩放、旋转、烟雾等等。 http://ios.itmdc.com/forum.php?mod=viewthread&tid=30 本文转自qianqianlianmeng博客园博客,原文链接:http://www.cnblogs.com/aimeng/archive/2012/12/05/2803161.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

wp实例开发精品文章源码推荐(8.20)

热门源码推荐WP7快递速查源码http://www.apkbus.com/android-115763-1-1.htmlWP7仿iphone气泡式短信界面 源码http://www.apkbus.com/android-115752-1-1.htmlWP7我的课程源码http://www.apkbus.com/android-117079-1-1.htmlWP7幻灯片翻页效果源码http://www.apkbus.com/android-121419-1-1.htmlWP7图片浏览源码http://www.apkbus.com/android-121138-1-1.htmlwp7手机归属地查询源码http://www.apkbus.com/android-115900-1-1.htmlwp7 天气预报程序http://www.apkbus.com/android-115897-1-1.htmlwindows phone 贪吃蛇游戏http://www.apkbus.com/android-115897-1-1.htmlWindows Phone 7手机闹钟的实例http://www.apkbus.com/android-115480-1-1.htmlWindows Phone 7 空当接龙扑克牌游戏实例源码http://www.apkbus.com/android-115751-1-1.html精品文章推荐 ------------------------------------------------------------------------------Windows phone中如何添加页面跳转动画http://www.apkbus.com/android-138683-1-1.htmlwindows phone8自学笔记http://www.apkbus.com/android-138685-1-1.htmlWindows phone中如何使用丰富的弹出框提示http://www.apkbus.com/android-138686-1-1.html从使用函数到使用委托http://www.apkbus.com/android-138689-1-1.htmlWindows phone中用RichTextBox实现文字、图片混合排版http://www.apkbus.com/android-138693-1-1.htmlWindows Phone 内容滑动切换实现http://www.apkbus.com/android-138699-1-1.htmlWindows phone中关于TextBox的一些积累http://www.apkbus.com/android-138701-1-1.htmlWindows Phone 处理 MessageBox导致的应用异常退出以及使用代码方式退出应用http://www.apkbus.com/android-138705-1-1.html[Windows Phone]应用内强制设置背景色(Dark/Light)http://www.apkbus.com/android-138707-1-1.htmlWP8点击桌面图标快速恢复应用http://www.apkbus.com/android-138708-1-1.htmlwinphone8 模拟器设置(新)http://www.apkbus.com/android-138712-1-1.htmlWindows Phone 8 中Pivot和Panorama控件手势监听的变化http://www.apkbus.com/android-138714-1-1.htmlwindows phone 图片缓存http://www.apkbus.com/android-138715-1-1.htmlwindows phone 从cer中提出公钥然后再RSA加密的问题http://www.apkbus.com/android-138717-1-1.html在 Windows Phone 8 应用中使用 SQLitehttp://www.apkbus.com/android-138719-1-1.htmlcocos2d-x for wp 之Box2D的应用http://www.apkbus.com/android-138722-1-1.html 本文转自qianqianlianmeng博客园博客,原文链接:http://www.cnblogs.com/aimeng/p/3270932.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

【Android开发坑系列】之try-catch

try { mViewPager.postDelayed( new Runnable() { @Override public void run() { getCurrentPage().render( false ); } }, 500 ); } catch (Exception e) { // 可忽略的异常 LogUtil.i(TAG, "=====" ); } 上面的写法实际上catch不到getCurrentPage().render(false)的异常,postDelayed会造成getCurrentPage().render(false)执行延迟 而需要这样写。 mViewPager.postDelayed( new Runnable() { @Override public void run() { try { getCurrentPage().render( false ); } catch (Exception e) { // 可忽略的异常 LogUtil.i(TAG, "======" ); } } }, 500 ); 本文转自Kai的世界,道法自然博客园博客,原文链接:http://www.cnblogs.com/kaima/p/3179703.html,如需转载请自行联系原作者。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册