1.base64图片加密
利用base64加密 ,ios7.0之后有的 ,保证安全
base64加密特点:针对二进制数据加密
将8 bit —> 6 bit 2的6次方 = 64;
不足的位数用0补齐,两个0 就是一个=号,加密之后的特点:加密之后数据中有=号,
base64
编码是现代密码学的基础
.
原本是
8
个
bit
一组表示数据
,
改为
6
个
bit
一组表示数据
,
不足的部分补零
,
每
两个
0
用
一个
=
表示
.
用
base64
编码之后
,
数据长度会变大
,
增加了大约
1
/
3
左右
.
base64
基本能够达到安全要求
,
但是
,base64
能够逆运算
,
非常不安全
!
base64
编码有个非常显著的特点
,
末尾有个
'='
号
.
利用终端命令进行
base64
运算
:
// 将文件 meinv.jpg 进行 base64 运算之后存储为 meinv.txt
base64 meinv.jpg -o meinv.txt
// 讲 meinv.txt 解码生成 meinv.png
base64 -D meinv.txt -o meinv.png
// 将字符串 "hello" 进行 base 64 编码 结果 :aGVsbG8=
echo "hello" | base64
// 将 base64 编码之后的结果 aGVsbG8= 反编码为字符串
echo aGVsbG8= | base64 -D
步骤:1.需要加密的二进制数据(就是需要加密的图片路径)nsdata
2.将二进制数据进行base64加密,
//
图片加密
NSData * data = [ NSData dataWithContentsOfFile : @"/Users/xxx/Desktop/dst2.png" ];
NSData * baseData = [ data base64EncodedDataWithOptions : 0 ];
NSData * data = [ NSData dataWithContentsOfFile : @"/Users/xxx/Desktop/dst2.png" ];
NSData * baseData = [ data base64EncodedDataWithOptions : 0 ];
[baseData writeToFile:@"/Users/xxx/Desktop/tupian"atomically:YES];
//
图片解密
NSData * baseData = [ NSData dataWithContentsOfFile : @"/Users/xxx/Desktop/tupian" ];
NSData * data = [ baseData initWithBase64EncodedData :baseData options : 0 ];
NSData * baseData = [ NSData dataWithContentsOfFile : @"/Users/xxx/Desktop/tupian" ];
NSData * data = [ baseData initWithBase64EncodedData :baseData options : 0 ];
[data writeToFile:@"/Users/xxx/Desktop/pist"atomically:YES];
2.MD5加密
MD5:信息-摘要算法/散列函数
使用:校验文件,
特点:顺序是不可逆的。。
1. 无论多大的数据,经过MD5
运算之后,得到的值是一个固定长度的字符串(16进制的大整数)。
2.任何两个不同的数据,经过MD5运算之后,得到的值肯定是不同的。
3.两个相近的数据(文件),经过MD5运算之后,得到的值差别很大。
步骤:
1.导入哈希头文件 NSString +hash 第三方框架,去GitHub上下载
2,设置原始密码nsstring
3.设置原始密码进行MD5加密 密码 = 原始密码的对象.MD5String
简单的密码字母或者数字,可以通过解密文件解密出密码,不安全
可以人为帮用户提高密码的复杂度。
MD5 加盐:在原来的密码基础上添加盐值,越复杂越好,
stringByAppendingString
运算结果:
MD5 -- (
信息
-
摘要算法
)
哈希算法之一
.
{
把一个任意长度的字节串变换成一定长度的十六进制的大整数 . 注意 , 字符串的转换过程是不可逆的 .
用于确保 ' 信息传输 ' 完整一致 .
MD5 特点 :
* 1. 压缩性 : 任意长度的数据 , 算出的 MD5 值长度都是固定的 .
* 2. 容易计算 : 从原数据计算出 MD5 值很容易 .
* 3. 抗修改性 : 对原数据进行任何改动 , 哪怕只修改一个字节 , 所得到的 MD5 值都有很大区别 .
* 4. 弱抗碰撞 : 已知原数据和其 MD5 值 , 想找到一个具有相同 MD5 值的数据 ( 即伪造数据 ) 是非常困难的 .
* 5. 强抗碰撞 : 想找到两个不同数据 , 使他们具有相同的 MD5 值 , 是非常困难的 .
MD5 应用 :
* 1. 一致性验证 : MD5 将整个文件当做一个大文本信息 , 通过不可逆的字符串变换算法 , 产生一个唯一的 MD5 信息摘要 . 就像每个人都有自己独一无二的指纹 ,MD5 对任何文件产生一个独一无二的 " 数字指纹 " .
利用 MD5 来进行文件校验 , 被大量应用在软件下载站 , 论坛数据库 , 系统文件安全等方面 .
* 2. 数字签名 ;
* 3. 安全访问认证 ;
{
把一个任意长度的字节串变换成一定长度的十六进制的大整数 . 注意 , 字符串的转换过程是不可逆的 .
用于确保 ' 信息传输 ' 完整一致 .
MD5 特点 :
* 1. 压缩性 : 任意长度的数据 , 算出的 MD5 值长度都是固定的 .
* 2. 容易计算 : 从原数据计算出 MD5 值很容易 .
* 3. 抗修改性 : 对原数据进行任何改动 , 哪怕只修改一个字节 , 所得到的 MD5 值都有很大区别 .
* 4. 弱抗碰撞 : 已知原数据和其 MD5 值 , 想找到一个具有相同 MD5 值的数据 ( 即伪造数据 ) 是非常困难的 .
* 5. 强抗碰撞 : 想找到两个不同数据 , 使他们具有相同的 MD5 值 , 是非常困难的 .
MD5 应用 :
* 1. 一致性验证 : MD5 将整个文件当做一个大文本信息 , 通过不可逆的字符串变换算法 , 产生一个唯一的 MD5 信息摘要 . 就像每个人都有自己独一无二的指纹 ,MD5 对任何文件产生一个独一无二的 " 数字指纹 " .
利用 MD5 来进行文件校验 , 被大量应用在软件下载站 , 论坛数据库 , 系统文件安全等方面 .
* 2. 数字签名 ;
* 3. 安全访问认证 ;
3
> MD5
加盐
{
MD5 本身是不可逆运算 , 但是 , 目前网络上有很多数据库支持反查询 .
MD5 加盐 就是在密码哈希过程中添加的额外的随机值 .
注意 : 加盐要足够长 , 足够复杂 .
{
MD5 本身是不可逆运算 , 但是 , 目前网络上有很多数据库支持反查询 .
MD5 加盐 就是在密码哈希过程中添加的额外的随机值 .
注意 : 加盐要足够长 , 足够复杂 .
}
3.时间戳密码
应用:将军令/网银:每分钟密码都改变一次
密码 + 当前时间 =
相同的密码明文
+
相同的加密算法
===
》
每次计算都得出不同的结果
.
可以充分保证密码的安全性
.
原理 : 将当前时间加入到密码中 ;
因为每次登陆时间都不同 , 所以每次计算出的结果也都不相同 .
服务器也需要采用相同的算法 . 这就需要服务器和客户端时间一致 .
注意 : 服务器端时间和客户端时间 , 可以有一分钟的误差 ( 比如 : 第 59 S 发送的网络请求 , 一秒钟后服务器收到并作出响应 , 这时服务器当前时间比客户端发送时间晚一分钟 ).
这就意味着 , 服务器需要计算两次(当前时间和一分钟之前两个时间点各计算一次) . 只要有一个结果是正确的 , 就可以验证成功 !
原理 : 将当前时间加入到密码中 ;
因为每次登陆时间都不同 , 所以每次计算出的结果也都不相同 .
服务器也需要采用相同的算法 . 这就需要服务器和客户端时间一致 .
注意 : 服务器端时间和客户端时间 , 可以有一分钟的误差 ( 比如 : 第 59 S 发送的网络请求 , 一秒钟后服务器收到并作出响应 , 这时服务器当前时间比客户端发送时间晚一分钟 ).
这就意味着 , 服务器需要计算两次(当前时间和一分钟之前两个时间点各计算一次) . 只要有一个结果是正确的 , 就可以验证成功 !
步骤: 导入头文件:哈希头文件 NSString +hash 第三方框架,去GitHub上下载
//
原始密码
NSString * pass = @"zhang" ;
// hmacKey 8a627a4578ace384017c997f12d68b23 密码是 itcast
NSString *hmacKey = @"8a627a4578ace384017c997f12d68b23" ;
// 第一次加密
pass = [pass hmacMD5StringWithKey :hmacKey];
NSLog ( @" 第一次加密之后的结果 :%@" ,pass);
// 取出当前时间
NSDate * date = [ NSDate date ];
// 格式化当前时间
NSDateFormatter * formtter = [[ NSDateFormatter alloc ] init ];
[ formtter setDateFormat : @"yyyy-MM-dd HH-mm" ];
// 获得 格式化之后的时间字符串 .
NSString *timer = [ formtter stringFromDate :date];
NSLog ( @" 当前时间 :%@" ,timer);
// 第二次加密 :
// 将第一次加密之后的值与当前时间的字符串拼接
pass = [pass stringByAppendingString :timer];
NSLog ( @" 与当前时间拼接之后的字符串 :%@" ,pass);
// 将拼接之后的字符串进行 hmac/MD5 加密
pass = [ pass hmacMD5StringWithKey :hmacKey];
NSLog ( @" 时间戳秘密 :%@" ,pass);
// 拼接 GET 请求参数
NSString *body = [ NSString stringWithFormat : @"username=zhangsan&password=%@" ,pass];
NSString *urlString = [NSString stringWithFormat: @"http://127.0.0.1/login/loginhmac.php?%@" ,body];
NSURL *url = [ NSURL URLWithString :urlString];
// 对于 GET 请求 , 可以直接传递 url .
[[[ NSURLSession sharedSession ] dataTaskWithURL :url completionHandler :^( NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//
NSLog ( @"%@" ,[[ NSString alloc ] initWithData :data encoding : NSUTF8StringEncoding ]);
}] resume ];
NSString * pass = @"zhang" ;
// hmacKey 8a627a4578ace384017c997f12d68b23 密码是 itcast
NSString *hmacKey = @"8a627a4578ace384017c997f12d68b23" ;
// 第一次加密
pass = [pass hmacMD5StringWithKey :hmacKey];
NSLog ( @" 第一次加密之后的结果 :%@" ,pass);
// 取出当前时间
NSDate * date = [ NSDate date ];
// 格式化当前时间
NSDateFormatter * formtter = [[ NSDateFormatter alloc ] init ];
[ formtter setDateFormat : @"yyyy-MM-dd HH-mm" ];
// 获得 格式化之后的时间字符串 .
NSString *timer = [ formtter stringFromDate :date];
NSLog ( @" 当前时间 :%@" ,timer);
// 第二次加密 :
// 将第一次加密之后的值与当前时间的字符串拼接
pass = [pass stringByAppendingString :timer];
NSLog ( @" 与当前时间拼接之后的字符串 :%@" ,pass);
// 将拼接之后的字符串进行 hmac/MD5 加密
pass = [ pass hmacMD5StringWithKey :hmacKey];
NSLog ( @" 时间戳秘密 :%@" ,pass);
// 拼接 GET 请求参数
NSString *body = [ NSString stringWithFormat : @"username=zhangsan&password=%@" ,pass];
NSString *urlString = [NSString stringWithFormat: @"http://127.0.0.1/login/loginhmac.php?%@" ,body];
NSURL *url = [ NSURL URLWithString :urlString];
// 对于 GET 请求 , 可以直接传递 url .
[[[ NSURLSession sharedSession ] dataTaskWithURL :url completionHandler :^( NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//
NSLog ( @"%@" ,[[ NSString alloc ] initWithData :data encoding : NSUTF8StringEncoding ]);
}] resume ];
4. 钥匙串访问 加密
苹果在
iOS
7.0.3
版本以后公布钥匙串访问的
SDK.
钥匙串访问接口是纯
C
语言的
.
钥匙串使用 AES 256 加密算法 , 能够保证用户密码的安全 .
钥匙串访问的第三方框架 (SSKeychain), 是对 C 语言框架 的封装 . 注意 : 不需要看源码 .
钥匙串访问的密码保存在哪里 ? 只有苹果才知道 . 这样进一步保障了用户的密码安全 .
使用步骤 :
钥匙串使用 AES 256 加密算法 , 能够保证用户密码的安全 .
钥匙串访问的第三方框架 (SSKeychain), 是对 C 语言框架 的封装 . 注意 : 不需要看源码 .
钥匙串访问的密码保存在哪里 ? 只有苹果才知道 . 这样进一步保障了用户的密码安全 .
使用步骤 :
导入头文件第三方框架: SSKeychain
{
// 获取应用程序唯一标识 .
NSString *bundleId = [NSBundle mainBundle].bundleIdentifier;
// 1. 利用第三方框架 , 将用户密码保存在钥匙串
[SSKeychain setPassword: self .pwdText.text forService:bundleId account: self .usernameText.text];
" 注意 " 三个参数 :
1. 密码 : 可以直接使用明文 . 钥匙串访问本身是使用 AES 256 加密 , 就是安全的 . 所以使用的时候 , 直接传递密码明文就可以了 .
2. 服务名 : 可以随便乱写 , 建议唯一 ! 建议使用 bundleId.
bundleId 是应用程序的唯一标识 , 每一个上架的应用程序都有一个唯一的 bundleId
{
// 获取应用程序唯一标识 .
NSString *bundleId = [NSBundle mainBundle].bundleIdentifier;
// 1. 利用第三方框架 , 将用户密码保存在钥匙串
[SSKeychain setPassword: self .pwdText.text forService:bundleId account: self .usernameText.text];
" 注意 " 三个参数 :
1. 密码 : 可以直接使用明文 . 钥匙串访问本身是使用 AES 256 加密 , 就是安全的 . 所以使用的时候 , 直接传递密码明文就可以了 .
2. 服务名 : 可以随便乱写 , 建议唯一 ! 建议使用 bundleId.
bundleId 是应用程序的唯一标识 , 每一个上架的应用程序都有一个唯一的 bundleId
3.
账户名
:
直接用用户名称就可以
.
例子:
- (
void
)viewDidLoad {
[
super
viewDidLoad
];
// 取出 app 的唯一标识符
NSString *bundleId = [ NSBundle mainBundle ]. bundleIdentifier ;
// 取出钥匙串中存储的密码
NSString *password = [ SSKeychain passwordForService :bundleId account : kUserNameKey ];
NSLog ( @"%@" ,password);
}
- ( void )touchesBegan:( NSSet < UITouch *> *)touches withEvent:( UIEvent *)event{
// 利用钥匙串存储密码
NSString * username = @"zhangsan" ;
NSString * password = @"zhang" ;
// 在偏好设置中存储账号
[[ NSUserDefaults standardUserDefaults ] setObject :username forKey : kUserNameKey ];
[[ NSUserDefaults standardUserDefaults ] synchronize ];
// 利用钥匙串存储密码
// Service: app 的唯一标识符 . 告诉钥匙串是哪一个 app 中的信息 .
// account: 账号 哪一个账号的信息 .
// 取出 app 的唯一标识符
NSString * bundle = [ NSBundle mainBundle ]. bundleIdentifier ;
BOOL is_YES = [ SSKeychain setPassword :password forService :bundle account : kUserNameKey ];
NSLog ( @"is_Yes: %d" ,is_YES);
// 取出 app 的唯一标识符
NSString *bundleId = [ NSBundle mainBundle ]. bundleIdentifier ;
// 取出钥匙串中存储的密码
NSString *password = [ SSKeychain passwordForService :bundleId account : kUserNameKey ];
NSLog ( @"%@" ,password);
}
- ( void )touchesBegan:( NSSet < UITouch *> *)touches withEvent:( UIEvent *)event{
// 利用钥匙串存储密码
NSString * username = @"zhangsan" ;
NSString * password = @"zhang" ;
// 在偏好设置中存储账号
[[ NSUserDefaults standardUserDefaults ] setObject :username forKey : kUserNameKey ];
[[ NSUserDefaults standardUserDefaults ] synchronize ];
// 利用钥匙串存储密码
// Service: app 的唯一标识符 . 告诉钥匙串是哪一个 app 中的信息 .
// account: 账号 哪一个账号的信息 .
// 取出 app 的唯一标识符
NSString * bundle = [ NSBundle mainBundle ]. bundleIdentifier ;
BOOL is_YES = [ SSKeychain setPassword :password forService :bundle account : kUserNameKey ];
NSLog ( @"is_Yes: %d" ,is_YES);
}
5. 指纹识别用法
指纹识别用法
{
指纹识别功能是 iphone 5 S 之后推出的 .SDK 是 iOS 8.0 推出 !
推出指纹识别功能的目的 , 是为了简化移动支付环节 , 占领移动支付市场 .
使用步骤 :
{
1 > 导入框架 ;
#import <LocalAuthentication/LocalAuthentication.h>
2 > 指纹识别的实现 :
{
1. 需要判断手机系统版本是否是 iOS 8.0 以上的版本 . 只有 iOS 8.0 以上才支持 .
// 获得当前系统版本号
float version = [UIDevice currentDevice].systemVersion.floatValue;
if (version < 8.0 ) // 判断当前系统版本
{
NSLog( @" 系统版本太低 , 请升级至最新系统 " );
return ;
}
2. 实例化指纹识别对象 , 判断当前设备是否支持指纹识别功能 ( 是否带有 TouchID).
// 1> 实例化指纹识别对象
LAContext *laCtx = [[LAContext alloc] init];
// 2> 判断当前设备是否支持指纹识别功能 .
if (![laCtx canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error: NULL ])
{ // 如果设备不支持指纹识别功能
NSLog( @" 该设备不支持指纹识别功能 " );
return ;
};
3. 指纹登陆 ( 默认是异步方法 )
// 指纹登陆
[laCtx evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason: @" 指纹登陆 " reply:^( BOOL success, NSError *error)
{
// 如果成功 , 表示指纹输入正确 .
if (success) {
NSLog( @" 指纹识别成功 !" );
} else
{
NSLog( @" 指纹识别错误 , 请再次尝试 " );
}
}];
}
}
}
指纹识别功能是 iphone 5 S 之后推出的 .SDK 是 iOS 8.0 推出 !
推出指纹识别功能的目的 , 是为了简化移动支付环节 , 占领移动支付市场 .
使用步骤 :
{
1 > 导入框架 ;
#import <LocalAuthentication/LocalAuthentication.h>
2 > 指纹识别的实现 :
{
1. 需要判断手机系统版本是否是 iOS 8.0 以上的版本 . 只有 iOS 8.0 以上才支持 .
// 获得当前系统版本号
float version = [UIDevice currentDevice].systemVersion.floatValue;
if (version < 8.0 ) // 判断当前系统版本
{
NSLog( @" 系统版本太低 , 请升级至最新系统 " );
return ;
}
2. 实例化指纹识别对象 , 判断当前设备是否支持指纹识别功能 ( 是否带有 TouchID).
// 1> 实例化指纹识别对象
LAContext *laCtx = [[LAContext alloc] init];
// 2> 判断当前设备是否支持指纹识别功能 .
if (![laCtx canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error: NULL ])
{ // 如果设备不支持指纹识别功能
NSLog( @" 该设备不支持指纹识别功能 " );
return ;
};
3. 指纹登陆 ( 默认是异步方法 )
// 指纹登陆
[laCtx evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason: @" 指纹登陆 " reply:^( BOOL success, NSError *error)
{
// 如果成功 , 表示指纹输入正确 .
if (success) {
NSLog( @" 指纹识别成功 !" );
} else
{
NSLog( @" 指纹识别错误 , 请再次尝试 " );
}
}];
}
}
}
导入头文件第三方框架: SSKeychain