网络开发中,大多都有用户登录的操作,用户隐私就显得很重要!
常用加密有三种方式 :
- 哈希(散列)函数 我们熟知的 MD5 加密
- 对称加密算法
- DES
- 3DES
- AES(高级密码标准,美国国家安全局使用的,iOS系统使用的加密方式(钥匙串))
- 非对称加密算法 RSA加密
散列函数
特点:
- 算法公开的.
- 对相同的数据加密,得到的结果是一样的.
- 对不同的数据加密,得到的结果是定长的,MD5对不同的数据进行加密,得到的结果都是32个字符.
- 信息摘要,信息"指纹",是用来做数据识别的.
- 不能反算的.
MD5 加密:
因为不能反算的特性,以及不同的数据 MD5 之后差别是非常大的!!经常是用来检验数据
当然,因为 MD5 对于同样的数据加密,得到的结果永远是相同的,所以,也是可以被破解出来的 --- 散列碰撞,找出不同的数据使用MD5之后能够得到相同的结果!
MD5 的基本安全:
1.加"盐"- 早期使用!
2.HMAC,近一两年,在国内开始使用增多!
给定一个密钥,对明文进行密钥拼接,并且做"两次散列"-> 得到32位结果!
HMAC :
- 用户在注册的那一刻,向服务器索取 密钥(key)!!
- 客户端拿到KEY的这一刻,就将KEY保存在本地!!
- 切换了新的设备(换手机登录,登录新的已有账号!) -- 重新找服务器获取!!
还有一种情况:
如果黑客 模拟你的网络请求..不需要拿到真实密码!用加密后的信息,也可以获得登录之后的权限!
避免方式 -- 增加参数时效性! 网络请求超时 一般不会有超过 60s 的 可以使用
MD5(数据+时间) 的方式与后台交互,只要服务器当前时间或者上一分钟 加密后的字符相等!就可以返回数据
对称加密 - 传统加密算法
- 加密和解密使用同一个"密钥"!
- 密钥的保密工作就非常的重要!! 密钥会定期更换!密钥的管理很重要!!
经典算法
- DES 数据加密标准(用的比较少,因为强度不够).
- 3DES 使用3个密钥,对相同的数据执行三次加密,强度增强.
- AES 高级加密标准,目前美国国家安全局使用AES加密,苹果的钥匙串访问就是使用
AES加密
两种加密方式: ECB和CBC
ECB: 电子代码本,就是将一个数据拆分为多块,然后独立加密的!
CBC: 密码块链,使用一个密钥和一个初始化"向量"对数据执行加密抓换
能保证密文的完整性,如果一个数据发生改变,后面所有的数据将会被破坏!
向量:某个方向的数量.
现代的密码学都和几何有关!因为几何(包含圆形\椭圆\球体)的变量是有规律的,但是结果是多变的!
非对称加密(RSA) - 现代加密算法
- 公钥\私钥
- 用公钥加密,私钥解密
- 用私钥加密,公钥解密
- 优点: 安全 缺点:速度慢
RSA加密计算量很大! 一般是用来对AES加密后的小数据进行加密!
RSA数字签名原理:
生成数据-->把数据进行MD5加密-->对MD5进行RSA加密-->发给服务器-->服务器对数据进行MD5加密-->服务器对RSA加密的数据进行解密-->对比两个数据,判断是否准确!
写点实用的: -- 对称加密代码
// 设置秘钥
NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding];
uint8_tcKey[self.keySize];
bzero(cKey,sizeof(cKey));
[keyDatagetBytes:cKeylength:self.keySize];
// 设置iv
uint8_tcIv[self.blockSize];
bzero(cIv,self.blockSize);
intoption =0;
if(iv) {
[ivgetBytes:cIvlength:self.blockSize];
option =kCCOptionPKCS7Padding;
}else{
option =kCCOptionPKCS7Padding | kCCOptionECBMode;
}
// 设置输出缓冲区
NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0];
size_tbufferSize = [datalength] +self.blockSize;
void*buffer =malloc(bufferSize);
// 开始加密/解密
size_tdecryptedSize =0;
CCCryptorStatuscryptStatus =CCCrypt(kCCDecrypt,
self.algorithm,
option,
cKey,
self.keySize,
cIv,
[databytes],
[datalength],
buffer,
bufferSize,
&decryptedSize);
NSData*result =nil;
if(cryptStatus ==kCCSuccess) {
result = [NSDatadataWithBytesNoCopy:bufferlength:decryptedSize];
}else{
free(buffer);
NSLog(@"失败|状态编码: %d", cryptStatus);
}
NSString * resultStr = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
主要用到的是
CCCryptorStatus CCCrypt(
CCOperationop, /* kCCEncrypt, etc. */
CCAlgorithmalg, /* kCCAlgorithmAES128, etc. */
CCOptionsoptions, /* kCCOptionPKCS7Padding, etc. */
constvoid*key,
size_tkeyLength,
const void*iv, /* optional initialization vector */
const void*dataIn, /* optional per op and alg */
size_tdataInLength,
void*dataOut, /* data RETURNED here */
size_tdataOutAvailable,
size_t*dataOutMoved)
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);
参数:
1.kCCEncrypt 加密/kCCDecrypt 解密
2.加密算法,默认使用的是 AES/DES
3.加密选项 ECB/CBC
kCCOptionPKCS7Padding CBC 的加密方式
kCCOptionPKCS7Padding | kCCOptionECBMode ECB 的加密方式
4.加密密钥
5.密钥长度
6.iv 初始化向量,ECB 不需要指定
7.加密的数据
8.加密的数据的长度
9.密文的内存地址
10.密文缓冲区的大小
11.加密结果大小