当前位置: 首页 > 科技观察

iOS几种常用加密方式总结!

时间:2023-03-21 00:31:42 科技观察

本文主要介绍了iOS中几种常见的加密方式,包括base64加密、POST加密、Token值介绍、MD5加密--hash算法之一(信息-摘要算法)、时间戳密码和指纹识别等方法本文通过示例代码详细介绍,需要的朋友可以参考。前言在我们的日常开发中,加密是必不可少的一环,普通的加密方式是将密码加密后保存在用户偏好设置中。钥匙串以明文形式保存,但具体存放位置未知。下面这篇文章我将为大家详细介绍iOS中几种常见的加密方式。下面就不多说了,一起来看看详细的介绍吧。1.Base64加密Base64编码是现代密码学的基本原理:原来是一组8位表示数据,改为一组6位表示数据,不足的部分用0补齐,每两个0表示为a=经过base64编码后,数据长度会增加1/3左右。(8-6)/6可以逆向解密。Xcode7.0之后出现的编码有一个非常显着的特点。末尾有一个=符号。加密文件//获取加密文件的二进制数据NSData*data=[NSDatadataWithContentsOfFile:@"/Users/wangpengfei/Desktop/photo/IMG_5551.jpg"];//或base64EncodedStringWithOptionsNSData*base64Data=[database64EncodedDataWithOptions:0];//将加密文件存储到桌面[base64DatawriteToFile:@"/Users/wangpengfei/Desktop/123"atomically:YES];解密文件//获取加密后的二进制数据NSData*base64Data=[NSDatadataWithContentsOfFile:@"/Users/wangpengfei/Desktop/123"];//解密base64数据NSData*baseData=[[NSDataalloc]initWithBase64EncodedData:base64Dataoptions:0];//写入桌面[baseDatawriteToFile:@"/Users/wangpengfei/Desktop/IMG_5551.jpg"原子地:YES];使用终端命令进行base64运算//base64运算后将文件meinv.jpg存为meinv.txt-omeinv.png//basethestring"hello"64encodingresult:aGVsbG8=cho"hello"|base64//base64编码后的结果aGVsbG8=反向编码成字符串echoaGVsbG8=|base64-D2.POST加密A.构建UI框架Login.storyboard两个UItextFiled:分别输入用户名和密码UIButton:登录按钮Main.storyboard直接拖一个navigationController->tableViewControllernavigationItem+注销按钮B.实现基本的加密和提取读取数据的方法-(void)readLocalUserInfo{//1.实例化偏好设置对象NSUserDefaults*userDefaults=[NSUserDefaultsstandardUserDefaults];//2.取出数据赋值self.userName.text=[userDefaultsobjectForKey:kUserNameKey];//加密后的密码self.password.text=[userDefaultsobjectForKey:kPasswordKey];}提取存储数据的方法-(void)saveLocalUserInfo{//1。实例化偏好设置对象NSUserDefaults*userDefaults=[NSUserDefaultsstandardUserDefaults];//2.存储用户名[userDefaultssetObject:self.userName.textforKey:kUserNameKey];//3.对密码进行base64加密//将密码转换成二进制数据NSData*data=[self.password.textdataUsingEncoding:NSUTF8StringEncoding];//加密NSString*base64Str=[database64EncodedStringWithOptions:0];//4.Encrypt最终密码存储在首选项设置中[userDefaultssetObject:base64StrforKey:kPasswordKey];//5.为了保证线程的一致性,是否存储无论是存储还是读取数据,都要同步[userDefaultssynchronize];}在点击事件中登录-(IBAction)btnLoginDidClick:(UIButton*)sender{//如果两个文本框都不为空,则登录if(self.userName.text.length&&self.password.text.length){//1.创建请求NSString*urlString=@"http://localhost/login/login.php";NSURL*url=[NSURURLWithString:urlString];//POST请求需要手动设置请求方式,所以对于可变请求NSMutableURLRequest*request=[NSMutableURLRequestrequestWithURL:url];//设置请求方式request.HTTPMethod=@"POST";//设置请求参数NSString*body=[NSStringstringWithFormat:@"username=%@&password=%@",self.userName.text,self.password.text];//将字符串转为二进制数据NSData*bodyData=[bodydataUsingEncoding:NSUTF8StringEncoding];//设置请求体(二进制数据)request.HTTPBody=bodyData;//2.发送请求[[[NSURLSessionsharedSession]dataTaskWithRequest:requestcompletionHandler:^(NSData*_Nullabledata,NSURLResponse*_Nullableresponse,NSError*_Nullableerror){//打印请求结果NSLog(@"data:%@",[[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding]);//判断是否登录成功if(data&&!error){NSLog(@"网络请求成功!");NSDictionary*dict=[NSJSONSerializationJSONObjectWithData:dataoptions:0error:nil];if(dict[@"userID"]){[selfsaveLocalUserInfo];}//跳转到app主界面,在主线程发送通知dispatch_async(dispatch_get_main_queue(),^{[[NSNotificationCenterdefaultCenter]postNotificationName:@"loginSuccess"object:nil];});}else{NSLog(@"Network请求失败!");}}]resume];}else{NSLog(@"用户名或密码不能为空!");}}C.实现页面间的跳转使用AppDelegate.m文件中的通知设置页面跳转开关-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions{//1的主要方法。注册登录成功的通知观察者[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(loginSuccess)name:@"loginSuccess"object:nil];//2.注册登录成功的通知观察者[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(logoutSuccess)name:@"logoutSuccess"object:nil];//app每次打开应该给用户展示哪个界面//3。使用用户在首选项中保存的信息来确定用户的登录状态NSString*userName=[[NSUserDefaultsstandardUserDefaults]objectForKey:kUserNameKey];NSString*password=[[NSUserDefaultsstandardUserDefaults]objectForKey:kPasswordKey];if(userName&&password){//显示app主界面[selfloginSuccess];}else{[selflogoutSuccess];}returnYES;}登录成功-(void)loginSuccess{NSLog(@"登录成功!");//获取主界面UIStoryboard*mainSb=[UIStoryboardstoryboardWithName:@"Main"bundle:nil];//切换controllerself.window.rootViewController=mainSb.instantiateInitialViewController;}Logoutsuccess-(void)logoutSuccess{NSLog(@"logoutsuccess!");//获取登录界面UIStoryboard*loginSb=[UIStoryboardstoryboardWithName:@"Login"bundle:nil];//切换controllerself.window.rootViewController=loginSb.instantiateInitialViewController;}在Main.storyboard关联的controller中设置注销按钮的点击事件//1.清除本地信息[[NSUserDefaultsstandardUserDefaults]removeObjectForKey:kUserNameKey];[[NSUserDefaultsstandardUserDefaults]removeObjectForKey:kPasswordKey];//同步信息[[NSUserDefaultsstandardUserDefaults]synchronize];//2.发送信息,切换controller[[NSNotificationCenterdefaultCenter]postNotificationName:@"logoutSuccess"object:nil];3、token值介绍token值:logintoken。使用token值来判断用户的登录状态。类似于MD5加密后的长字符串。用户登录成功后,下面的客户端(服务器端)会根据用户信息生成一个唯一值。该值是令牌值。基本使用:服务器(数据库)会保存这个token值,后面会用这个token值来检索对应的用户信息,判断用户的登录状态。用户登录成功后,服务端会将生成的token值返回给客户端,同时token值也会保存在客户端。环境。))。以后客户端发送新的网络请求时,默认会自动附加这个token值(作为参数传递给服务端)。服务端拿到客户端传过来的token值和数据库中保存的token值进行比较,从而判断用户身份和登录状态。判断登录状态:如果客户端没有这个token值,说明没有登录成功,提示用户登录,如果客户端有token值,一般认为登录成功。用户无需再次登录(输入账号和密码信息)。Token价值扩展:Token价值有一个有效期:对于一般的应用,Token价值有效期在1年以上。特殊应用:银行类应用/支付类应用:token价值过期时间约15分钟。一旦用户信息发生变化(修改密码),服务器端将生成新的token值,原token值将失效。需要重新输入账号和密码,才能得到生成的新token值。独特性判断:每次登录都会产生一个新的token值。原始令牌值将失效。使用时间来判断登录之间的差异。四。MD5加密--(信息-摘要算法)哈希算法之一任意长度的字节串转换成一定长度的十六进制大整数。注意字符串的转换过程是不可逆的,无法通过加密后的结果逆推出原来的内容。基础介绍需要导入第三方框架:NSString+HashMD5特点:可压缩性:对于任意长度的数据,计算出的MD5值长度是固定的。易于计算:很容易从原始数据中计算出MD5值。抵抗的修改:对原始数据进行任何修改,即使只修改一个字节,得到的MD5值也有很大的不同。弱防碰撞:知道原始数据及其MD5值,想要找到一个MD5值相同的数据(即伪造数据)是非常困难的。强防碰撞:很难找到两个不同的数据使它们具有相同的MD5值。MD5应用:一致性验证:MD5把整个文件当作一个大文本信息,通过不可逆的字符串转换算法,生成唯一的MD5信息摘要。就像每个人都有自己独特的指纹一样,MD5为任何文件生成一个独特的数字指纹。使用MD5进行文件校验,广泛应用于软件下载站点、论坛数据库、系统文件安全等(是否考虑添加木马、篡改文件内容等)。百度'MD5'首先进入网站,利用数据库进行伪解密,即反向查询数字签名;安全访问认证;使用方法用MD5加密字符串NSString*password=@"WangPengfei";password=[passwordmd5String];NSLog(@"password1:%@",password);加盐:可以保证MD5加密更安全[passwordmd5String];NSLog(@"password2:%@",密码);每个公司都有自己的“盐值”,盐值越复杂,越有保障。时间戳密码基本介绍动态密码:同一个密码明文+同一个加密算法-->因为每次登录的时间不一样,所以每次计算出来的结果也不一样。可以充分保证密码的安全性。服务器会计算两个时间值,当前时间和上一分钟的时间(例如:59S发送的网络请求,一秒后服务器接收并响应。此时服务器的当前时间为一比客户端发送时间晚一分钟,仍可判断准确值)使用步骤获取MD5***加密后的密码//1。当前密码NSString*password=@"zhang";//2.hmacKey值为“王鹏飞”MD5加密后的值(动态生成)NSString*hmacKey=@"d3bba33b51acaa0a272de7a2f6dfa233";加密过程//1.***加密:***HMACoperationpassword=[passwordhmacMD5StringWithKey:hmacKey];//2.1获取当前时间NSDate*date=[NSDatedate];//2.2获取当前时间的字符串//实例化时间格式化器NSDateFormatter*formatter=[[NSDateFormatteralloc]init];//设置时间格式formatter.dateFormat=@"yyyy-MM-ddHH:mm";//获取当前时间(与服务器保持一致)NSString*dateStr=[formatterstringFromDate:date];//3.将第一个加密密码与当前时间字符串拼接password=[passwordstringByAppendingString:dateStr];//4.进行第二次HMAC加密password=[passwordhmacMD5StringWithKey:hmacKey];访问loginhmac.php接口,发送请求创建请求NSURL*url=[NSURLURLWithString:@"http://localhost/login/loginhmac.php"];//POST需要手动设置方法,所以它是变量NSMutableURLRequest*request=[NSMutableURLRequestrequestWithURL:url];//设置请求方式request.HTTPMethod=@"POST";//设置请求体内容NSString*body=[NSStringstringWithFormat:@"username=zhangsan&password=%@",password];request.HTTPBody=[bodydataUsingEncoding:NSUTF8StringEncoding];发送请求[[[NSURLSessionsharedSession]dataTaskWithRequest:requestcompletionHandler:^(NSData*_Nullabledata,NSURLResponse*_Nullableresponse,NSError*_Nullableerror){NSLog(@"%@",[[NSStringalloc]initEnWithData:dataencoding:NSUTF);}]恢复];6.钥匙串接入基本介绍苹果在iOS7.0.3之后发布了钥匙串接入SDK。keychain访问接口是纯C语言。keychain使用AES256加密算法保证密码安全。钥匙串接入第三方框架SSKeychain是对C语言框架的封装。注意:您不需要查看源代码。钥匙串访问的密码存储在哪里?只有苹果知道。这样进一步保护了用户的密码安全。简单使用参数介绍Password:需要存储的密码信息。Service:用于标识app,app的唯一标识。account:账户信息,当前密码对应的账户。使用keychain加密//获取应用的唯一标识.NSString*bundleId=[NSBundlemainBundle].bundleIdentifier;//使用第三方框架将用户密码保存在keychain中[SSKeychainsetPassword:self.pwdText.textforService:bundleIdaccount:@"wpf"];从钥匙串中加载密码self.pwdText.text=[SSKeychainpasswordForService:bundleIdaccount:@"wpf"];7、指纹识别简介。指纹识别功能是在iPhone5S之后推出的。SDK在iOS8.0上线!推出指纹识别功能的目的是为了简化移动支付流程。占领移动支付市场。使用导入框架的步骤#import获取当前系统版本号floatversion=[UIDevicecurrentDevice].systemVersion.floatValue;if(version<8.0)//判断当前系统版本{NSLog(@"系统版本过低,请升级到***系统");return;}实例化指纹识别对象,判断当前设备是否支持指纹识别功能(是否带TouchID)//1>实例化指纹识别对象LAContext*laCtx=[[LAContextalloc]init];//2>判断当前设备是否支持指纹识别功能.if(![laCtxcanEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometricserror:NULL]){//如果设备不支持指纹识别功能NSLog(@"本设备不支持指纹识别功能");return;};指纹登录(默认为异步方式)[laCtxevaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometricslocalizedReason:@"Fingerprintlogin"reply:^(BOOLsuccess,NSError*error){//如果成功,说明指纹输入正确。if(success){NSLog(@"指纹识别成功!");}else{NSLog(@"指纹识别错误,请重试");}}];总结:以上就是本篇的全部内容文章。希望本文的内容对您的学习或工作有一定的参考价值。有什么问题可以留言交流。感谢您的支持