有四种加密方式
**
- 1.公钥私钥的加密和解密
**
//公钥和私钥称为非对称加密解密,通过公钥和私钥的钥匙对儿进行对数据加密和解密
//公钥一般存才客户端,私钥一般存在服务器端,而且私钥必须要加密,保证安全不猛泄露
//公钥对数据加密之后,将密文发送到服务器端,服务器再利用私钥对密文进行解密,服务器信息通过私钥进行加密,再通过客户端的公钥进行解密,从而显示内容
//公钥和私钥使用在像支付宝,微信支付等和钱有关的操作上
NSString *publicKey=@"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEChqe80lJLTTkJD3X3Lyd7Fj+\nzuOhDZkjuLNPog3YR20e5JcrdqI9IFzNbACY/GQVhbnbvBqYgyql8DfPCGXpn0+X\nNSxELIUw9Vh32QuhGNr3/TBpechrVeVpFPLwyaYNEk1CawgHCeQqf5uaqiaoBDOT\nqeox88Lc1ld7MsfggQIDAQAB\n-----END PUBLIC KEY-----";
NSString *str=@"明天不用上课";
//通过公钥对这个字符串进行加密
NSString *encryStr = [RSA encryptString:str publicKey:publicKey];
NSLog(@"%@",encryStr);
//通过私钥把密文进行加密
NSString *privateKey=@"-----BEGIN RSA PRIVATE KEY-----\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMQKGp7zSUktNOQk\nPdfcvJ3sWP7O46ENmSO4s0+iDdhHbR7klyt2oj0gXM1sAJj8ZBWFudu8GpiDKqXw\nN88IZemfT5c1LEQshTD1WHfZC6EY2vf9MGl5yGtV5WkU8vDJpg0STUJrCAcJ5Cp/\nm5qqJqgEM5Op6jHzwtzWV3syx+CBAgMBAAECgYEApSzqPzE3d3uqi+tpXB71oY5J\ncfB55PIjLPDrzFX7mlacP6JVKN7dVemVp9OvMTe/UE8LSXRVaFlkLsqXC07FJjhu\nwFXHPdnUf5sanLLdnzt3Mc8vMgUamGJl+er0wdzxM1kPTh0Tmq+DSlu5TlopAHd5\nIqF3DYiORIen3xIwp0ECQQDj6GFaXWzWAu5oUq6j1msTRV3mRZnx8Amxt1ssYM0+\nJLf6QYmpkGFqiQOhHkMgVUwRFqJC8A9EVR1eqabcBXbpAkEA3DQfLVr94vsIWL6+\nVrFcPJW9Xk28CNY6Xnvkin815o2Q0JUHIIIod1eVKCiYDUzZAYAsW0gefJ49sJ4Y\niRJN2QJAKuxeQX2s/NWKfz1rRNIiUnvTBoZ/SvCxcrYcxsvoe9bAi7KCMdxObJkn\nhNXFQLav39wKbV73ESCSqnx7P58L2QJABmhR2+0A5EDvvj1WpokkqPKmfv7+ELfD\nHQq33LvU4q+N3jPn8C85ZDedNHzx57kru1pyb/mKQZANNX10M1DgCQJBAMKn0lEx\nQH2GrkjeWgGVpPZkp0YC+ztNjaUMJmY5g0INUlDgqTWFNftxe8ROvt7JtUvlgtKC\nXdXQrKaEnpebeUQ=\n-----END RSA PRIVATE KEY-----";
NSString *decryStr=[RSA decryptString:encryStr privateKey:privateKey];
NSLog(@"%@",decryStr);
NSDictionary *dic=@{@"不能说":@"的秘密",@"J哥特点":@"眼睛小"};
//对象转换成NSData(1)
// NSData *data=[NSKeyedArchiver archivedDataWithRootObject:dic];
//通过json进行可逆操作(2)
NSData *data=[NSJSONSerialization dataWithJSONObject:dic options:0 error:nil];
//上面两种方法都可以(1)(2)
//对字典等对象进行加密操作的时候,先转换成NSData
//通过公钥进行加密
NSData *encryData=[RSA encryptData:data publicKey:publicKey];
//根据私钥进行解密
NSData *dencrtData=[RSA decryptData:encryData privateKey: privateKey];
NSDictionary *newDic=[NSJSONSerialization JSONObjectWithData:dencrtData options:0 error:nil];
[newDic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"%@",key);
NSLog(@"%@",obj);
}];
//服务器通过加密之后的密文,客户需要用公钥去解密
NSString *encryptStr = @"F+feHOH6807tUV/drvepAMzKlVKRsoDFRkFNfhS9kgVoBt2E6OnUIVw12l608yQGWiqtq8rgZgMY/VCQYZB+3r2rhDlyZ2fjo00sUFOp5BkNPFTs/NpQAolD6V3ifNgDmBQP92uVbxbod1pLRwLC0wLOhr5flQXvvobeg5KrDeE=";
//客户端接收到这段秘闻之后,通过手里的公钥进行解密操作
NSString *str2=[RSA decryptString:encryptStr publicKey:publicKey];
NSLog(@"%@",str2);
**
- 2.钥匙串加密
**
//在用钥匙串进行加密的时候,一定要把当前工程从ARC改成MRC
KeychainItemWrapper *wrapper=[[KeychainItemWrapper alloc] initWithIdentifier:@"chain" accessGroup:nil];
//通过钥匙串加密用户名
[wrapper setObject:@"郡主" forKey:(id)kSecAttrAccount];
//通过钥匙串加密密码
[wrapper setObject:@"123456" forKey:(id)kSecValueData];
//解密
NSString *userName=[wrapper objectForKey:(id)kSecAttrAccount];
NSString *passWord=[wrapper objectForKey:(id)kSecValueData];
NSLog(@"%@",userName);
NSLog(@"%@",passWord);
//一般来讲,当程序被删除之后,沙盒里保存的内容,比如收藏,或者用户名,密码等信息都被移除掉了,所以在这个时候想要保留用户账号等信息可以通过钥匙串进行保存,存到钥匙串中的数据也是相对安全的
**
- 3.Base64加密解密
**
需要引用Base64文件
#import "GTMBase64.h"
//对字符串进行加密
NSString *encodStr=[GTMBase64 encodeBase64String:@"程金乐眼睛小"];
NSLog(@"%@",encodStr);
//解密
NSString *dencodeStr=[GTMBase64 decodeBase64String:encodStr];
NSLog(@"%@",dencodeStr);
//
NSDictionary *dic=@{@"少爷":@"一直在吃",@"郡主":@"一直在研究吃",@"尹德建":@"看他俩吃"};
NSData *data=[NSJSONSerialization dataWithJSONObject:dic options:0 error:nil];
NSData *encode=[GTMBase64 encodeData:data];
//解码
NSData *newData=[GTMBase64 decodeData:encode];
NSDictionary *newDic=[NSJSONSerialization JSONObjectWithData:newData options:0 error:nil];
NSLog(@"%@",newDic);
**
- MD5加密解密
**
同样需要引文件
#import "NSString+MD5.h"
#import <CommonCrypto/CommonCrypto.h>
//加密:一般客户端或者服务器端需要发送一些比较私密的东西的时候会对数据进行加密操作,用户把数据传给服务器端后,一般来讲原样保存到数据库中
//加密主要是通过各种的算法,将一个明文转换成密文的过程,加密没有绝对安全,只是照比原来的明文相对安全,现在公司都不会使用单一的加密方式,越复杂算法越难破译
//加密之后的内容一般都是原样保存在服务器上,等到再有类似操作,直接用密文进行比较就可以进行判断,所以像qq等公司不会知道用户密码是多少,只有用户自己知道
//所以像腾讯百度等公司在用户忘记密码时,一般都会让用户重置密码,因为他们不知道密码是什么
// NSString *userName=@"tfBoy";
// NSString *passWord=@"19950625";
// //对字符串进行MD5加密
// NSString *secName=[userName stringFromMD5];
// NSLog(@"%@",secName);
//
// NSLog(@"%@",[secName stringFromMD5]);
//
// NSString *secPassName=[passWord stringFromMD5];
//只能进行加密,解不了
NSString *pass=@"123456";
NSString *secStr=[pass stringFromMD5];
//撒盐加密:向密文里随机位置添加一些特殊字符
//把不可变字符串变成可变字符串
NSMutableString *muStr=[NSMutableString stringWithString:secStr];
//向这个可变字符串里随机改变一些内容
[muStr insertString:@"s" atIndex:2];
[muStr insertString:@"b" atIndex:5];
NSLog(@"%@",muStr);
NSLog(@"%@",secStr);