标签:
一、数据安全
1、术语:
2、数据安全
二、MD5加密
1、哈希算法:
2、MD5:
3、获取字符串MD5值:引入<CommonCrypto/CommonCrypto.h>、获取字符串的MD5值。
代码示例:
// 1.准备一个字符串用于加密(同一个字符串进行MD5加密出来的内容类似) NSString *str = @"I Love you"; // 2.因为MD5是基于C语言的,所以需要将字符串进行编码 const char *data = [str UTF8String]; // 3.使用字符串数组去存取加密后相关的内容(MD5 16进制,32位) // CC_MD5_DIGEST_LENGTH 表示长度 unsigned char result [CC_MD5_DIGEST_LENGTH]; // 4.进行MD5加密 // 参数1:需要加密的内容 // 参数2:要加密的data的一个长度 // 参数3:存储加密结果的数组(MD5) CC_MD5(data, (CC_LONG)strlen(data), result); // 5.创建可变字符串,保存结果 NSMutableString *mStr = [NSMutableString string]; // 6.遍历结果数组,然后添加到可变字符串中 for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { [mStr appendFormat:@"%02x", result[i]]; }
4、获取其它对象MD5值:引入<CommonCrypto/CommonCrypto.h>、将其它对象转化为NSData对象(可以将对象事先写入文件)、读取NSData对象的MD5值。
代码示例:(以数组为例)
// 需求:创建一个数组,数组中存储元素,将这个数组写入到沙盒里 // 创建数组 NSArray *array = @[@"Jack", @"Rose"]; // 找沙盒路径 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; // 拼接路径 NSString *arrayPath = [path stringByAppendingPathComponent:@"array.plist"]; // 写入 [sender writeToFile:arrayPath atomically:YES]; // 从沙盒中取出NSData数据 NSData *data = [NSData dataWithContentsOfFile:arrayPath]; // NSData类型数据加密过程 // 1.创建MD5对象 CC_MD5_CTX md5; // 2.初始化MD5对象 CC_MD5_Init(&md5); // 3.准备开始进行数据加密 CC_MD5_Update(&md5, data.bytes, (CC_LONG)data.length); // 4.结束MD5加密 // 准备一个字符串数组用来存储结果 unsigned char result[CC_MD5_DIGEST_LENGTH]; CC_MD5_Final(result, &md5); // 5.获取结果 NSMutableString *mStr = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH]; // 遍历数组给可变字符串赋值 for (int i = 0; i< CC_MD5_DIGEST_LENGTH; i++) { [mStr appendFormat:@"%02x", result[i]]; } NSLog(@"%@", mStr);
注:
三、钥匙串加密
1、钥匙串简介:钥匙串:(英文:Keychain)是苹果公司Mac OS中的密码管理系统。它在Mac OS 8.6中和iOS7之后被导入,并且包括在了所有后续的各版本中。一个钥匙串可以包含多种类型的数据:密码(包括网站,FTP服务器,SSH帐户,网络共享,无线网络,群组软件,加密磁盘镜像等),私钥,电子证书和加密笔记等。
2、钥匙串加密:
3、钥匙串的使用:
// 首先需要导入钥匙串的第三方KeychainItemWrapper.h/m // 创建钥匙串对象 // 参数1:标识,用于识别后面加密的内容(回传标识符) // 参数2:分组,一般为nil KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:identifier accessGroup:nil]; // 常用与加密用户名和密码 // 系统提供的键值对中的两个键,非系统的键是没法添加到字典中的 id kUserName = (__bridge id)kSecAttrAccount; id kPasswordName = (__bridge id)kSecValueData; [keychainItem setObject:@"user" forKey:kUserName]; [keychainItem setObject:@"123456" forKey:kPasswordName]; // 通过相同的标识创建的钥匙串中具有相同的数据 KeychainItemWrapper *keychainItem2 = [[KeychainItemWrapper alloc] initWithIdentifier:identifier accessGroup:nil]; NSString *name = [keychainItem objectForKey:kUserName]; NSString *pwd = [keychainItem2 objectForKey:kPasswordName]; NSLog(@"%@, pwd = %@", name, pwd);
4、注意:
四、公钥加密
1、公钥加密简介:
2、公钥加密:(公钥和私钥的具体生成方法)
//公钥和私钥都是使用证书生成的,并非我们自定义字符串就可以。我们使用的是生成好的公钥和私钥 //其中-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----不属于密钥部分 //公钥:iOS客户端使用,我们拿到手公钥以后,只需要根据公钥处理数据就可以 // 获取公钥的数据 NSString *publicKey = @"-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfzVL2ZaZvmSGAl6j3Fxsn1aqYq1gbDhQGZIeLxDwh5FVNdIvGIFe/S3wlTIO8lHlc9IACD894GG6Aqlfs24oTgKeHGCIiaBKB7x3g458/GbwSiOryUnVxJKFkV+lKB9TlJJW4egcHieiN/m1xKnlKmRsGlTJYyoY7Nhihyc8HAQIDAQAB-----END PUBLIC KEY-----"; // 创建字符串 NSString *testStr = @"加密示例"; // 创建存储公钥的字符串,加密 NSString *encPublicKey = [RSA encryptString:testStr publicKey:publicKey]; NSLog(@"encpublic = %@", encPublicKey);
3、私钥解密:(私钥解密的字符串需要由JAVA后台提供,)
// 私钥:用于解密数据的.注意:不能泄露,否则数据不安全! NSString *privateKey = @"-----BEGIN PRIVATE KEY-----MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAN/NUvZlpm+ZIYCX qPcXGyfVqpirWBsOFAZkh4vEPCHkVU10i8YgV79LfCVMg7yUeVz0gAIPz3gYboCqV+zbihOAp4cYIiJoEoHvHeDjnz8ZvBKI6vJSdXEkoWRX6UoH1OUklbh6BweJ6I3+bXEqeUqZGwaVMljKhjs2GKHJzwcBAgMBAAECgYEAjPJIv3kBOuNb4BqjhQn+RjYgfIncsR1Kq0QAwZtSq52bw24U4TBZUtZ9Vxg7FzcCv/IT9Dh01xO79DhTq44QBE7Gkxy9sLK/uKo6ffnYxWxx0/l6yWtPLiwRfzvI1BInnxf24UOn/Qe1wZPBG305y3es2mdIem5Kko7SVHqtLYECQQDzd4cxIYcOZIyVWjTCIpwC6w45yRbndBbpt4GpgOZ6 hGQ8eeFHpZjLnJgHWISnCvCG76PWBFG+4fwewL7/5mNJAkEA61Klr4wnMCUyrkjAPK+pt9yQLb71qoobendLFd1BoYL1fZNar3ntkq0bp4AB+MkwS2dZvXAJKXTtyw9fBH/N+QJBAKwXbOP5gvFVeVmIbYpb1FLrux51WU8464lAQNKDXmZzdjaZH/f4wUwK4BsxInLAdMusT+5TF0UJj6BdNaTEQKECQ+duJLt7BwM2tVzORrOfKwMgEwRYMpSSb8dFl9lNtuEkUIIqAfrxwuv5XGeMEf0BcasMfdoDSKLW3aENLjHV5kCQQC4FJK6 nB02fK7f1co1254OlaYHDmD7NErYAazqeT+KVHZjV76rO6BGeldy+SnXTzLrWGbIjxgYr1bFTXL+0AI/-----END PRIVATE KEY-----"; // 创建存储私钥的字符串 NSString *result = @"";// 经过加密之后需要把加密的内容传送给后台,此时后台会给你返回一个字符串 // 参数1:由java后台提供 // 参数2:私钥 NSString *encPrivateKey = [RSA decryptString:result privateKey:privateKey]; NSLog(@"(PHP enc)encPrivate = %@", encPrivateKey);
五、KVO
1、KVO简介:
2、KVO使用步骤:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 第一步:注册观察者 //参数1:添加的观察者对象 //参数2:字符串标识的key //参数3:什么时候回触发添加观察者对象 //NSKeyValueObservingOptionNew key和value只要有一个更新的时候就会触发 //NSKeyValueObservingOptionOld //NSKeyValueObservingOptionInitial //NSKeyValueObservingOptionPrior //参数4:文本内容 一般为nil [self addObserver:self forKeyPath:@"array" options:NSKeyValueObservingOptionNew context:nil]; } // 视图将要消失的时候 - (void)viewWillDisappear:(BOOL)animated { // 在不需要观察者的时候 [self removeObserver:self forKeyPath:@"array"]; } // 第二步:实现回调方法 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { NSLog(@"keyPath = %@",keyPath); NSLog(@"object = %@", object); NSLog(@"change = %@", change); // 可以进行刷新UI的操作 } // 第三步:触发可变数组进行改变 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { NSArray *subArr = @[@"1", @"2", @"3"]; // 根据keyPath获取到可变数据对象,setArray给可变数组对象设置数据 [[self mutableArrayValueForKeyPath:@"array"] setArray:subArr]; NSLog(@"subArr = %@", [self mutableArrayValueForKeyPath:@"array"]); }
标签:
原文地址:http://www.cnblogs.com/lishishi/p/5495022.html