- 散列(哈希)算法
:MD5 SHA256/512
算法公开
不同的数据加密之后的结果是定长度的 MD5 32个字符!
数据“指纹”,它只是数据的一部分
不可逆,但是同样的数据 MD5值是一样的
散列碰撞:不同的数据得到了同样的HASH值!!
开发中,客户端开发,密码加密!服务器不知道用户的密码!所以现在没有“找回密码”的功能,只有重置密码!
对称:AES DES 3DES
:明文—》密钥—》密文
:密文—》密钥—》明文非对称:RSA
: 公钥加密,私钥解密
: 私钥加密,公钥解密
从业务逻辑来讲,非对称加密要比对称加密要相对安全,但是效率不高,不提倡大量数据的加密的使用,而仅仅对关键数据进行使用。
#import "ViewController.h"
#import "NSString+Hash.h"
@interface ViewController ()
@end
@implementation ViewController
//盐
static NSString * salt =@"*DJSF(*QYEWOIOAJ()*)ASDASDASD";
- (void)viewDidLoad {
[super viewDidLoad];
//发给服务器校验!
NSString * pwd =@"123456";
// pwd=[pwd stringByAppendingString:salt];
// pwd=pwd.md5String;
//加密!直接MD5加密
//直接发送给服务端pwd可以嘛?
//答案是不可以,因为虽然MD5是不可逆的,但是一些简单的密码转换成哈希值之后是固定的,有大量的网站依然可以匹配出你加密后的哈希,然后找到你的原密码。那有没有方法解决呢?我们可以进行“加盐”
//如果盐被泄露呢?那就严重了,所以肯定不能使用固定的盐
//我们尝试另一种方式:HMAC
pwd =[pwd hmacSHA1StringWithKey:@"hank"];
//(HMAC密码+服务器时间戳+盐(服务器和客户端商议))md5
//服务端存储用户名 key HMAC密码
//服务端验证:1.(HMAC密码+服务器时间戳(时间戳只到分钟)+key(服务器和客户端商议)MD5
//2.(HMAC密码+服务器时间戳(上1分钟)+key(服务器和客户端商议)MD5
NSLog(@"加密之后:%@",pwd);
/*
非对称加密算法
一.运行终端,生成私钥
1.cd /Users/mac/Desktop/iOS/加密
2.openssl genrsa -out private.pem 512 //生成私钥,注意:这个私钥其实是放在服务器的
3.openssl rsa -in private.pem -out public.pem -pubout //通过2生成的私钥获取公钥
4.我们会发现已经在加密文件下,创建成功了两个文件
5.cat private.pem //打开私钥,可以看见base64编码的文件格式
6. openssl rsa -in private.pem -text -out private.txt //转换成明文格式打开看看
RSA加密使用效率偏低,它有哪些应用场景呢?
我们都知道私钥是放在服务端的,公钥是在客户端的。何为公钥?公钥可以理解为公共钥匙,任何客户端都可以向服务器获取公钥。当你的项目在被做逆向的时候,其他人就可以模仿客户端来获取公钥,所以没有绝对的安全,只有相对的安全。因此我们的重要数据仍然需要做加密处理。我们知道OC的方法调用和函数调用是不一样的,方法调用可以显示方法名,而函数调用则返回的是内存地址。所以在大公司中,一些核心算法都是使用的C。
*/
}