用户安全:

  原则:在网络传输过程中,关于用户的密码是不能传递明文的,需要通过加密之后进行传递,

    一般采用的加密技术是:

      (1)md5+盐

      (2)hmac+md5

      (3)hmac+md5+时间戳   这里的时间戳每次加密的密码结果不一样,密码有效时间是1分钟。它更加安全。

md5:同样的数据,每次进行加密的结果都是采用32位的字符串

     它是不可逆的,常用的密码,可以在cmd5.com查询到。

     生成数据的特征码,成为信息的指纹,信息摘要

base64:是可逆的。

//
// ViewController.m
// post-login(登陆)
//
// Created by jerry on 15/10/14.
// Copyright (c) 2015年 jerry. All rights reserved.
// #import "ViewController.h"
#import "NSString+Hash.h"
#import "SSKeychain.h"
/**
* 安全隐患:
尽管发送数据的过程中,密码进行了“二进制”转化,但是实际上密码还是一个明文,(密文) 解决办法:base64编码(base加密)
base64是网络上使用最为广泛的一种编码格式。
作用:可以将二进制数据转换成字符串。 有时候网络请求,希望只传递字符串:
1.url中的参数,直接带上图片传输。
2.银联的网银接口把整个消费的凭据生成一个数据的格式然后进行base64的编码,编码完成后,再传给服务器。 base64特点:
编码过后的结果,只有64个字符。a~z A~Z 0~9 / + 再加上一个辅助字符 = */
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *nameText;
@property (weak, nonatomic) IBOutlet UITextField *pwdText; @end @implementation ViewController
- (IBAction)loginClick { // 加密
NSString *username = self.nameText.text;
// NSString *pwd = [self base64encode:self.pwdText.text ];
// 简单的md5加密
// NSString *pwd = self.pwdText.text.md5String; // 加盐
NSString *salt = @"@##$#@SDS!@#WD!$!";
NSString *pwd = [[self.pwdText.text stringByAppendingString:salt] md5String];
NSLog(@"%@",pwd);
// 1.url
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/login.php"];
// 2.request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy: timeoutInterval:2.0f]; request.HTTPMethod = @"POST";
NSString *bodyStr = [NSString stringWithFormat:@"username=%@&password=%@",username,pwd];
request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding]; // 3.connection
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 反序列化
id result = [NSJSONSerialization JSONObjectWithData:data options: error:NULL]; NSLog(@"%@",result);
// 跟服务端进行沟通
if ([result[@"userId"] intValue] > ) {
#define kLoginUserNameKey @"kLoginUserNameKey"
#define kLoginUserPwdKey @"kLoginUserPwdKey"
// 登录成功 记录用户信息,记录到偏好设置里
[[NSUserDefaults standardUserDefaults] setObject:username forKey:kLoginUserNameKey]; // [[NSUserDefaults standardUserDefaults] setObject:pwd forKey:kLoginUserPwdKey]; //为了及时保存,需要同步
[[NSUserDefaults standardUserDefaults] synchronize];
#define kLoginServiceName @"kLoginServiceName"
/**
* 参数
setPassword:用户密码的明文
forService:登录的服务名
account:用户的用户名
*/
[SSKeychain setPassword:self.pwdText.text forService:kLoginServiceName account:self.nameText.text];
}
}];
}
-(void)viewDidLoad
{
[super viewDidLoad];
// NSLog(@"%@",[self base64encode:@"A"]);
// NSLog(@"%@",[self base64encode:@"Man"]);
//
// 取出用户信息
self.nameText.text = [[NSUserDefaults standardUserDefaults] stringForKey:kLoginUserNameKey]; // NSString *pwd = [[NSUserDefaults standardUserDefaults] stringForKey:kLoginUserPwdKey];
//
// if (pwd) {
// self.pwdText.text = pwd;
// }
// 打印出来存储的所有的钥匙串的服务信息。密码是打印不出来的。
NSLog(@"%@",[SSKeychain allAccounts]);
// 显示出来,取出钥匙串里面的信息。
if (self.nameText.text.length > ) {
NSString *pwd = [SSKeychain passwordForService:kLoginServiceName account:self.nameText.text];
self.pwdText.text = pwd;
}
}
/**
* 解码
*
* @param str
*
* @return
*/
- (NSString *)base64decode:(NSString *)str
{
if (str.length>&&str!=NULL){
// 1.先把base64编码过后的字符串转换成二进制数据,
NSData *data = [[NSData alloc]initWithBase64EncodedString:str options:]; return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}else{
return @"";
} }
/**
* BASE64转换。 j加密
*
* @param str
*
* @return
*/
- (NSString *)base64encode:(NSString*)str
{
// 1.把字符串转换成二进制数据
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; return [data base64EncodedStringWithOptions:];
} @end

IOS中的用户安全的更多相关文章

  1. 苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功

    苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功 这是苹果wwdc2021 推出的新功能 参考官网链接 App Store Server API | Apple Deve ...

  2. iOS中数据库应用基础

    iOS 数据库入门 一.数据库简介 1.什么是数据库? 数据库(Database) 是按照数据结构来组织,存储和管理数据的仓库 数据库可以分为2大种类 关系型数据库(主流) PC端 Oracle My ...

  3. 正则表达式在iOS中的运用

    1.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  4. iOS 中的 HotFix 方案总结详解

    相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...

  5. RSA算法及其在iOS中的使用

    因为项目中需要传输用户密码,为了安全需要用RSA加密,所以就学习了下RSA加密在iOS中的应用. 关于RSA的历史及原理,下面的两篇文章讲的很清楚了:  http://www.ruanyifeng.c ...

  6. iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)

    关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...

  7. iOS中获取各种文件的目录路径的方法

    我们的app在手机中存放的路径是:/var/mobile/Applications/4434-4453A-B453-4ADF535345ADAF344 后面的目录4434-4453A-B453-4AD ...

  8. 1.0 iOS中的事件

    本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书”   在用户使用app过程中,会产生各种各样的事件,iOS中的事件可以分为3大类型: UIK ...

  9. iOS中事件传递过程

    iOS中,UIApplication管理着一个事件的队列,当系统获取用户的点击或滑动等事件后,就会将这些事件按顺序插入UIApplication管理的这个队里中,UIApplication再从这个队列 ...

随机推荐

  1. HihoCoder - 1498 Diligent Robots

    There are N jobs to be finished. It takes a robot 1 hour to finish one job. At the beginning you hav ...

  2. Helm使用详解

    使用1.helm search 查看charts stable是官方的 local是自己的 2.查看repo helm repo list 3.安装 helm install stable/mysql ...

  3. can总线的示波器检测方法

    stm32的can总线是在APB1上的,stm32f10x的主频是72Mhz,can外设时钟是36Mhz,stm32f2xx的主频是120Mhz,can外设时钟是30Mhz... STM32 APB1 ...

  4. GO调度模型的缺点

    记一次latency问题排查:谈Go的公平调度的缺陷 http://baijiahao.baidu.com/s?id=1587897390639953806&wfr=spider&fo ...

  5. Java关键字synchronized详解

    Java多线程thread互联网制造  synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话 ...

  6. 51nod1238 最小公倍数之和 V3

    又被这神仙题给坑爆了. 神仙题解. 一开始我把lcm变成ij/gcd然后按照常规套路去推,推到最后发现不是miu * Id而是miu · Id......这还搞鬼啊. 正解居然跟这个差不多,先转成求其 ...

  7. Spring3.x 获取properties资源文件的值

    Spring3.x 获取properties资源文件的值有两种方式:  第一种:使用<context:property-placeholder />标签  <context:prop ...

  8. 设置 webstorm 对 .vue 高亮

    1. 首先安装vue插件,安装方法: setting  -->  plugin  ,点击plugin,在内容部分的左侧输入框输入vue,会出现两个关于vue的插件,点击安装即可.安装完成后,就可 ...

  9. 安装使用hibernate tools

    help-Eclipse marketplace-hibernate(搜索)-jboss tools(安装)

  10. maven的pom.xml文件标签含义

    pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以 ...