一文件压缩.这里我们需要一个第三方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