标签:
在互联网发展趋势迅猛的今天,数据安全的重要性日趋凸显。也成为我们必须了解的互联网知识。
在移动互联网浪潮下,用户的资金安全、企业的信息安全都是我们实际开发中必须考虑的内容。
1、需要引入CommonCrypto/CommonCrypto.h
2、获取字符串的MD5值
1 #pragma mark - MD5加密字符串,不能解密 2 // 1、准备一个字符串用于加密 3 // 同一个字符串进行MD5加密之后得到的内容相同 4 NSString *str = @"I Love You"; 5 // 2、因为MD5是基于C语言封装起来的,所以需要将字符串进行编码 6 const char *data = [str UTF8String]; 7 // 3、使用字符数组去存取加密后的相关内容 8 // CC_MD5_DIGEST_LENGTH表示长度 9 // 因为是32位的,所以用unsigned,无符号的 10 unsigned char result[CC_MD5_DIGEST_LENGTH]; 11 // 4、进行MD5加密 12 // 参数1:需要加密的内容 13 // 参数2:要加密的内容的长度 14 // 参数3:存放加密后结果的地址 15 CC_MD5(data, (CC_LONG)strlen(data), result); 16 // 5、保存结果 -- 创建可变字符串,将result数组中的内容保存到字符串中 17 NSMutableString *resultStr = [NSMutableString string]; 18 // 6、遍历结果数组 19 for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { 20 // 16进制的占位符%x 21 [resultStr appendFormat:@"%02x", result[i]]; 22 } 23 NSLog(@"%@", resultStr);
MD5加密结果
1、引入<CommonCrypto/CommonCrypto.h>
2、将其它对象转化为NSData对象(可以将对象事先写入文件)
3、读取NSData对象的MD5值
1 // 需求:创建一个数组,数组中存储元素,将这个数组写入到沙盒里 2 // 1、创建数组 3 NSArray *array = @[@"baby", @"yyp", @"bbh"]; 4 // 2、找Documents路径 5 NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 6 NSString *arrayPath = [documentPath stringByAppendingPathComponent:@"array.plist"]; 7 [array writeToFile:arrayPath atomically:YES]; 8 9 // 从沙盒中取出NSData类型的数据 10 NSData *data = [NSData dataWithContentsOfFile:arrayPath]; 11 12 #pragma mark - NSData类型数据加密过程 13 // 1、创建一个MD5对象 14 CC_MD5_CTX md5; 15 // 2、初始化md5 16 CC_MD5_Init(&md5); 17 // 3、准备开始进行数据的加密 18 // 参数1:MD5对象的地址 19 // 参数2:data的字节数 20 // 参数3:data的长度 21 CC_MD5_Update(&md5, data.bytes, (CC_LONG)data.length); 22 // 4、准备一个字符数组用来存储结果 23 unsigned char result[CC_MD5_DIGEST_LENGTH]; 24 // 5、保存结果 -- 创建可变字符串,将result数组中的内容保存到字符串中 25 NSMutableString *resultStr = [NSMutableString string]; 26 // 6、结束加密 27 CC_MD5_Final(result, &md5); 28 // 7、遍历结果数组 29 for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { 30 [resultStr appendFormat:@"%02x", result[i]]; 31 } 32 NSLog(@"resultStr = %@", resultStr);
MD5加密结果
1、引入<CommonCrypto/CommonCrypto.h>
2、将其它对象转化为NSData对象(归档)
3、读取NSData对象的MD5值
Person.h
1 #import <Foundation/Foundation.h> 2 3 // 遵守NSCoding协议 4 @interface Person : NSObject<NSCoding> 5 @property (nonatomic, copy) NSString *name; 6 @property (nonatomic, copy) NSString *gender; 7 @property (nonatomic, assign) NSInteger age; 8 9 // 自定义初始化方法 10 - (instancetype)initWithName:(NSString *)name 11 gender:(NSString *)gender 12 age:(NSInteger)age; 13 @end
Person.m
1 #import "Person.h" 2 3 @implementation Person 4 5 // 自定义初始化方法 6 - (instancetype)initWithName:(NSString *)name 7 gender:(NSString *)gender 8 age:(NSInteger)age { 9 if (self = [super init]) { 10 self.name = name; 11 self.gender = gender; 12 self.age = age; 13 } 14 return self; 15 } 16 17 // 归档 18 - (void)encodeWithCoder:(NSCoder *)aCoder { 19 [aCoder encodeObject:self.name forKey:@"name"]; 20 [aCoder encodeObject:self.gender forKey:@"gender"]; 21 [aCoder encodeInteger:self.age forKey:@"age"]; 22 } 23 24 // 反归档 25 - (instancetype)initWithCoder:(NSCoder *)aDecoder { 26 self = [super init]; 27 if (self) { 28 self.name = [aDecoder decodeObjectForKey:@"name"]; 29 self.gender = [aDecoder decodeObjectForKey:@"gender"]; 30 self.age = [aDecoder decodeIntegerForKey:@"age"]; 31 } 32 return self; 33 } 34 35 @end
ViewController.m
1 #import "ViewController.h" 2 #import "Person.h" 3 #import <CommonCrypto/CommonCrypto.h> 4 5 @interface ViewController () 6 7 @end 8 9 @implementation ViewController 10 11 - (void)viewDidLoad { 12 [super viewDidLoad]; 13 /** 14 * 完成自定义Person对象的加密过程 15 */ 16 // 创建Person类对象 17 Person *person = [[Person alloc] initWithName:@"yyp" gender:@"girl" age:23]; 18 // 归档成NSMutableData类型的数据 19 NSMutableData *data = [NSMutableData data]; 20 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 21 [archiver encodeObject:person forKey:@"person"]; 22 [archiver finishEncoding]; 23 24 // data加密 25 CC_MD5_CTX md5; 26 CC_MD5_Init(&md5); 27 CC_MD5_Update(&md5, data.bytes, (CC_LONG)data.length); 28 unsigned char result[CC_MD5_DIGEST_LENGTH]; 29 NSMutableString *resultStr = [NSMutableString string]; 30 CC_MD5_Final(result, &md5); 31 for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { 32 [resultStr appendFormat:@"%02x", result[i]]; 33 } 34 NSLog(@"resutltStr = %@", resultStr); 35 36 }
MD5加密结果
使用第三方类:KeychainItemWrapper
注意:
设置ARC&MRC混编
1 #import "ViewController.h" 2 #import "KeychainItemWrapper.h" 3 4 @interface ViewController () 5 6 @end 7 8 @implementation ViewController 9 10 - (void)viewDidLoad { 11 #pragma mark - 钥匙串加密方式 12 // 1、创建钥匙串对象,通过相同的标记创建的钥匙串中具有相同的数据,可以看做是一个对象 13 // 参数1:标识,用于识别加密的内容(回传标识符) 14 // 参数2:分组 一般为nil 15 KeychainItemWrapper *keycharinItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"myItemWrapper" accessGroup:nil]; 16 // 常用于加密用户名和密码 17 // 系统提供的键值对中的两个键,非系统的键是没法加到字典中的 18 id kUserName = (__bridge id)kSecAttrAccount; 19 id kPasswordKey = (__bridge id)kSecValueData; 20 [keycharinItem setObject:@"MBboy" forKey:kUserName]; 21 [keycharinItem setObject:@"123456" forKey:kPasswordKey]; 22 // 从keychain中获取存储的数据 23 NSString *userName = [keycharinItem objectForKey:kUserName]; 24 NSString *password = [keycharinItem objectForKey:kPasswordKey]; 25 NSLog(@"username = %@, password = %@", userName, password); 26 } 27 28 @end
运行结果
1 - #!/usr/bin/env bash 2 - echo "Generating RSA key pair ..." 3 - echo "1024 RSA key: private_key.pem" 4 - openssl genrsa -out private_key.pem 1024 5 - 6 - echo "create certification require file: rsaCertReq.csr" 7 - openssl req -new -key private_key.pem -out rsaCertReq.csr 8 - 9 - echo "create certification using x509: rsaCert.crt" 10 - openssl x509 -req -days 3650 -in rsaCertReq.csr -signkey private_key.pem -out rsaCert.crt 11 - 12 - echo "create public_key.der For IOS" 13 - openssl x509 -outform der -in rsaCert.crt -out public_key.der 14 - 15 - echo "create private_key.p12 For IOS. Please remember your password. The password will be used in iOS." 16 - openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt 17 - 18 - echo "create rsa_public_key.pem For Java" 19 - openssl rsa -in private_key.pem -out rsa_public_key.pem -pubout 20 - echo "create pkcs8_private_key.pem For Java" 21 - openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt 22 - 23 - echo "finished."
生成7个文件
公钥所在文件:rsa_public_key.pem
私钥所在文件:pkcs8_private_key.pem
然后使用终端命令:"cat 文件名"获取文件中的密钥
在工程中导入第三方类:RSA
在从终端复制密钥到Xcode中时会复制上回车符,需要大家手动删除,注意不要多删
1 #import "ViewController.h" 2 #import "RSA/RSA.h" 3 4 @interface ViewController () 5 6 @end 7 8 @implementation ViewController 9 10 - (void)viewDidLoad { 11 [super viewDidLoad]; 12 // 获取公钥私钥数据 13 // 公钥:iOS客户端使用,我们拿到公钥以后,只需要根据公钥处理数据就可以 14 NSString *publicKey = @"-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9YE8sZKdQWUZRBKDeF8xxlDcoRlT5QOJcQ7AOLc3Gswjs1fVmpPvX4E/NEV2KS0f0NEeT3URsv3LmnS6v3CTvUqbk2+SabQFiq4jfTuyW5OFYVadX6vzZnKHdX35Z7LZNwfc+slFqfWdMVyLSSoq8br87v6uonM05Mk1Mf8rK4QIDAQAB-----END PUBLIC KEY-----"; 15 16 // 私钥:用于解密数据的,不能泄露,否则会造成信息不安全 17 NSString *privateKey = @"-----BEGIN PRIVATE KEY-----MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAL1gTyxkp1BZRlEEoN4XzHGUNyhGVPlA4lxDsA4tzcazCOzV9Wak+9fgT80RXYpLR/Q0R5PdRGy/cuadLq/cJO9SpuTb5JptAWKriN9O7Jbk4VhVp1fq/Nmcod1fflnstk3B9z6yUWp9Z0xXItJKirxuvzu/q6iczTkyTUx/ysrhAgMBAAECgYBqCACMZJbhf/rE5giEEWMgvNHdNPPi0xdqfWOXrMGoXRnEMU/DduCjUC6eLPjos5nH+3WQLrVfBhp5UMyRHnt2pYGm3tsU1R5ieLZhMdcsfDQBBw67f1ov6gpktQ7r2AdJerxo2QlfhvvrjayV+TpPbRB5yk9z+z5iMccwj2vTWQJBAN/Xu7SC6YFNuZcIx5rzpOJoZ/CkdcBFvBpRGa3mAiXqv2+NyJemp0JY42x/9TiAnShrDRFd9OU72NhSjA2VHrcCQQDYlQBEbr1S4KJ1Zk7CzVppf+vIWJSSg/7oc3X98yTsoOBd5XBRQ7bLvcGiUMsHvXVibmwjrvQ7YayXQKCPCMsnAkBOsYlL7LoquyiD8JI752wQLKRd9XNwJRP8LIbanAIlUmH61d2vcudaa+WIP3P2aUDW9MujT2TJMkEJy/twyvwBAkAzVsaUciegsKzx5UmANctbvL34ZL77KBzRnyT2CJ/VE6F7wHpqWQHIs/dlcX9fG1Lq/T/XCY7NUK7nv6MPpMb7AkEA3rX/1V9HHSiTQe5MYfydB7s6duIR432xykR3ZYWjGBXNWFwwuI3wNcAJqkXWzOsbcz2oIRIZiaL9H1teOGQivg==-----END PRIVATE KEY-----"; 18 19 // 创建字符串 20 NSString *testStr = @"小暖心"; 21 // 创建存储公钥加密后的字符串,并使用RSA进行加密处理 22 // 参数1:需要加密的内容 23 // 参数2:公钥字符串 24 NSString *encPublicKey = [RSA encryptString:testStr publicKey:publicKey]; 25 // 创建存储用私钥解密后的字符串 26 // 参数1:由JAVA后台提供 27 // 参数2:私钥字符串 28 NSString *result = @""; // 经过加密之后需要把加密的内容传给后台,此时后台会返回一个字符串 29 NSString *encPrivateKey = [RSA decryptString:result privateKey:privateKey]; 30 NSLog(@"%@", encPublicKey); 31 NSLog(@"%@", encPrivateKey); 32 } 33 34 @end
运行结果:
标签:
原文地址:http://www.cnblogs.com/fearlessyyp/p/5510935.html