• iOS文件解压&&数据加密


    一文件压缩.这里我们需要一个第三方SSZipArchive(需要添加libz.td)

     1 #import "ViewController.h"
     2 #import "SSZipArchive.h"
     3 
     4 @interface ViewController ()
     5 
     6 @end
     7 
     8 @implementation ViewController
     9 
    10 - (void)viewDidLoad {
    11     [super viewDidLoad];
    12     // Do any additional setup after loading the view, typically from a nib.
    13     //获取沙盒地址
    14     NSLog(@"%@",NSHomeDirectory());
    15     
    16 
    17
    18     NSArray * array = @[[[NSBundle mainBundle] pathForResource:@"传输中加密" ofType:@"png"],
    19                         [[NSBundle mainBundle] pathForResource:@"加密请求头" ofType:@"png"]
    20                         ];
    21 //    根据所有文件的地址压缩文件
    22     [SSZipArchive createZipFileAtPath:@"/Users/wxn/Desktop/image.zip" withFilesAtPaths:array];
    23     
    24     
    25     NSString * path = [[[NSBundle mainBundle] bundlePath]
    26                        stringByAppendingPathComponent:@"images"];
    27     
    28     NSLog(@"%@",path);
    29     //根据目录压缩文件
    30     [SSZipArchive createZipFileAtPath:@"/Users/wxn/Desktop/image.zip" withContentsOfDirectory:path];
    31 
    32 }
     1 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
     2     
     3   //触屏压缩跟解压  
     4  [[[NSURLSession sharedSession] downloadTaskWithURL:[NSURL URLWithString:@"http://localhost/image.zip"] completionHandler:      ^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
     5         
     6         //unzipFileAtPath 压缩包的路径
     7         //toDestination 解压后的路径
     8         
     9         NSString * cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    10         
    11         [SSZipArchive unzipFileAtPath:location.path toDestination:cachesPath];
    12         
    13         
    14         
    15     }] resume];
    16 }

     二数据加密

    1.Base64加密

      1、 字符串转化为base64字符串

    NSString * string = @"ABC";
    
        NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding];(字符串转UTF8data)
    
        NSString * base64String = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];(data转字符串)
    
        NSLog(@"%@",base64String);

    //    2、加密后的data转化成加密前的字符串

    //     将普通的data转化为加密后的data

    NSString * string = @"ABC";
    
        NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding];
    
        NSData * base64Data = [data base64EncodedDataWithOptions:0];    

        //加密后的Data转换为普通data

      NSData * data2 = [[NSData alloc] initWithBase64EncodedData:base64Data options:0];
    
        NSString * string2 = [[NSString alloc] initWithData:data2 encoding:NSUTF8StringEncoding];
    
        NSLog(@"%@",string2);
     1  UIImage * image = [UIImage imageNamed:@"111"];
     2     NSData * data = UIImagePNGRepresentation(image);
     3     
     4     NSString * base64String = [data base64EncodedStringWithOptions:0];
     5     
     6     //解密图片
     7     NSData * decodeData = [[NSData alloc] initWithBase64EncodedString:base64String options:0];
     8     UIImage * decodeImage = [[UIImage alloc] initWithData:decodeData];
     9     
    10     self.imageView.image = decodeImage;

    2.MOD加密

    MD5同样是需要第三方代码

    Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护

     是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。

     MD5算法具有以下特点:

     1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。

     2、容易计算:从原数据计算出MD5值很容易。

     3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

     4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

     MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。   

    相比较Base64,原则上MD5是不可逆的,当然市面上有在线破解MD5但是

    较复杂的破解时间相对长,因此MD5还是很可靠的

     我们可以加盐来增加破译难度。

     1 #import "ViewController.h"
     2 #import "NSString+Hash.h"
     3 
     4 @interface ViewController ()
     5 
     6 @end
     7 
     8 @implementation ViewController
     9 
    10 - (void)viewDidLoad {
    11     [super viewDidLoad];
    12     // Do any additional setup after loading the view, typically from a nib.
    13     
    14     NSString * password = @"123";
    15     
    16     NSLog(@"%@",password.md5String);
    17     
    18     //md5加盐
    19     NSString * repassword = [password stringByAppendingString:@"vbd,AS.JFLD.ADj"];
    20     
    21     NSLog(@"%@",repassword.md5String);
    22 }
    23 
    24 - (void)didReceiveMemoryWarning {
    25     [super didReceiveMemoryWarning];
    26     // Dispose of any resources that can be recreated.
    27 }

    3.其他加密方式

    国家规定密码不能明文存储

    因此常用来密码加密的有MD5+盐

    盐选用即时传送的时间

    这个是加密请求头

    除了MD5还有一个更靠谱的加密方式

    iCloud 钥匙串,这是苹果给我们提供的密码保存的解决方案,iOS7之后有的。

     存沙盒:

     1、如果手机越狱,密码容易被窃取。

     2、当软件更新时,沙盒里的内容是不被删除的。但是,如果将软件卸载后重装,沙盒里的数据就没有了。

     3、每个APP的沙盒是相对独立的,密码无法共用。

     存钥匙串里:

     1、苹果提供的安全方案,rsa加密,相对安全。

     2、无论软件更新或删除,密码都存在,都可以自动登录。

     3、同一公司的APP密码是可以共用的。

     钥匙串c语言的

     1 #import "ViewController.h"
     2 #import "NSString+Hash.h"
     3 #import "SSKeychain.h"
     4 @interface ViewController ()
     5 
     6 @property (weak, nonatomic) IBOutlet UITextField *usernameTF;
     7 
     8 @property (weak, nonatomic) IBOutlet UITextField *passwordTF;
     9 
    10 @end
    11 
    12 @implementation ViewController
    13 
    14 - (IBAction)login:(id)sender {
    15     
    16     NSString * username = self.usernameTF.text;
    17     NSString * password = self.passwordTF.text;
    18     
    19     /**
    20      *  setPassword 密码
    21         Service 服务标识
    22         account 用户名
    23      */
    24     
    25 #define kLoginService @"loginService"
    26     
    27     [SSKeychain setPassword:password forService:kLoginService account:username error:NULL];
    28     
    29 //    NSUserDefaults * ud = [NSUserDefaults standardUserDefaults];
    30 //    
    31 //    [ud setObject:username forKey:@"username"];
    32 //    [ud setObject:password forKey:@"password"];
    33 //    
    34 //    [ud synchronize];
    35 }
    36 
    37 - (void)viewDidLoad {
    38     [super viewDidLoad];
    39     // Do any additional setup after loading the view, typically from a nib.
    40     
    41     NSLog(@"%@",NSHomeDirectory());
    42     
    43     //获取所有账户
    44     for (id keychain in [SSKeychain allAccounts]) {
    45         
    46         NSLog(@"%@",keychain);
    47     }
    48     
    49 //    self.usernameTF.text = @"Daquan";
    50 //    
    51 //    //通过服务,账号找到密码
    52 //    self.passwordTF.text = [SSKeychain passwordForService:kLoginService account:@"Daquan" error:NULL];
    53     
    54     //删除钥匙串
    55     
    56 //    [SSKeychain deletePasswordForService:kLoginService account:@"Daquan" error:NULL];
    57     
    58     
    59     
    60 //    NSUserDefaults * ud = [NSUserDefaults standardUserDefaults];
    61 //    
    62 //    NSString * username = [ud objectForKey:@"username"];
    63 //    NSString * password = [ud objectForKey:@"password"];
    64 //    
    65 //    if (username&&password) {
    66 //        
    67 //        self.usernameTF.text = username;
    68 //        self.passwordTF.text = password;
    69 //    }
    70     
    71  
    72 }
    73
    74 - (void)didReceiveMemoryWarning {
    75     [super didReceiveMemoryWarning];
    76     // Dispose of any resources that can be recreated.
    77 }
    78 
    79 @end
  • 相关阅读:
    数据结构之查找算法总结笔记
    html的a链接的href怎样才另起一个页面
    深入理解CSS中的空白符和换行
    CSS文本方向
    alert()与console.log()的区别
    CSS旧版flex及兼容
    Java:类与继承
    Java中只有按值传递,没有按引用传递!
    String作为方法参数传递 与 引用传递
    Java:按值传递还是按引用传递详细解说
  • 原文地址:https://www.cnblogs.com/iOSlearner/p/5308382.html
Copyright © 2020-2023  润新知