加密(文件或者登入信息等等)



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 ];
   
    [baseData writeToFile:@"/Users/xxx/Desktop/tupian"atomically:YES];


  //   图片解密
   
   
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. 安全访问认证 ;
      3 > MD5 加盐
    {
        MD5
本身是不可逆运算 , 但是 , 目前网络上有很多数据库支持反查询 .
       
        MD5
加盐 就是在密码哈希过程中添加的额外的随机值 .
       
       
注意 : 加盐要足够长 , 足够复杂 .
    }


3.时间戳密码

应用:将军令/网银:每分钟密码都改变一次
   
密码 + 当前时间 =  

      相同的密码明文 + 相同的加密算法 === 每次计算都得出不同的结果 . 可以充分保证密码的安全性 .
       
       
原理 : 将当前时间加入到密码中 ;
       
       
因为每次登陆时间都不同 , 所以每次计算出的结果也都不相同 .
       
       
服务器也需要采用相同的算法 . 这就需要服务器和客户端时间一致 .
       
       
注意 : 服务器端时间和客户端时间 , 可以有一分钟的误差 ( 比如 : 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 ];





4.   钥匙串访问  加密


    苹果在 iOS 7.0.3 版本以后公布钥匙串访问的 SDK. 钥匙串访问接口是纯 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
       
        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);
   
}
       

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(
@" 指纹识别错误 , 请再次尝试 " );
                 }
             }];
        }
    }
}

   导入头文件第三方框架: SSKeychain
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值