Hash的特点
- 算法是公开的
- 对相同数据运算,得到的结果是一样的
- 对不同数据运算,如MD5得到的结果默认是128位,32个字符(16进制标识)
- 无法逆运算
- 信息摘要,信息指纹,是用来做数据识别的
Hash用途
- 用户密码的加密
- 用户引擎
- 版权
- 数字签名
密码加密
- 直接使用MD5
- MD5加盐
- HMAC加密方案
- 添点东西
对称加密
对称加密方式:明文通过密钥加密得到密文,密文通过密钥解密得到明文
常见算法
- DES 数据加密标准(用得少,因为强度不够)
- 3DES 使用3个密钥,对相同的数据执行3次加密,强度增强
- AES 高级密码标准
应用模式
-
ECB(Electronic Code Book):电子密码本模式,每一块数据,独立加密,是最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况很少使用
-
CBC(Cipher Block Chaining):密码分组链接模式,使用一个密钥和一个初始化向量[IV]对数据进行加密,明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始化向量,相同的密文加密后悔形成不同的密文,这是目前应用最广泛的模式,CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误),另外CBC可以有效的保证密文的完整性,如果一个数据块在传递是丢失或改变,后面的数据将无法正常解密。
OpenSSL 操作
AES (ECB)加密 "hello" 字符串
echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
AES(CBC)加密"hello"字符串
echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
解密:
AES(ESC)解密
echo -n d1QG4T2tivoOKiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d
AES(CBC)解密
···
echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc-iv 0102030405060708 -K 616263 -nosalt -d
···
安全隐患
/** AES - ECB */
NSString * key = @"abc";
NSString * encStr = [[EncryptionTools sharedEncryptionTools] encryptString:@"hello" keyString:key iv:nil];
NSLog(@"加密的结果是:%@",encStr);
NSLog(@"解密的结果是:%@",[[EncryptionTools sharedEncryptionTools] decryptString:encStr keyString:key iv:nil]);
/** AES - CBC 加密 */
uint8_t iv[8] = {1,2,3,4,5,6,7,8};
NSData * ivData = [NSData dataWithBytes:iv length:sizeof(iv)];
NSLog(@"CBC加密:%@",[[EncryptionTools sharedEncryptionTools] encryptString:@"hello" keyString:@"abc" iv:ivData]);
NSLog(@"解密:%@",[[EncryptionTools sharedEncryptionTools] decryptString:@"u3W/N816uzFpcg6pZ+kbdg==" keyString:key iv:ivData]);
这两种加密,底层使用的都是CCCrypt 这个方法
CCCryptorStatus CCCrypt(
CCOperation op, /* kCCEncrypt, etc. */
CCAlgorithm alg, /* kCCAlgorithmAES128, etc. */
CCOptions options, /* kCCOptionPKCS7Padding, etc. */
const void *key,
size_t keyLength,
const void *iv, /* optional initialization vector */
const void *dataIn, /* optional per op and alg */
size_t dataInLength,
void *dataOut, /* data RETURNED here */
size_t dataOutAvailable,
size_t *dataOutMoved)
API_AVAILABLE(macos(10.4), ios(2.0));
CCCrypt 对称加密算法的核心函数(负责加密解密)
- 参数1.kCCEncrypt 加密/kCCDecrypt解密
- 参数2.加密算法,默认的AES/DES
- 参数3:加密方式的选项 kCCOptionPKCS7Padding | kCCOptionECBMode;//ECB 加密! kCCOptionPKCS7Padding;//CBC加密
- 参数4.加密密钥
- 参数5.密钥长度
- 参数6.iv初始化向量,ECB不需要指定
- 参数7.加密的数据
- 参数8.加密的数据长度
- 参数9.缓冲区(地址).存放密文的
- 参数10.缓冲区的大小
- 参数11.加密结果大小
然后运行项目,会发现项目停留在 Snip20200422_13.png
这个时候,通过终端界面,打印出相关值情况 Snip20200422_15.png
可以看到,别人可以通过逆向hook住某个方法,然后就可以将我的加密内容给打印出来,针对这个问题,我们可以在加密之前先对我们要加密的字符串进行一些处理,例如异或呀,md5,HMAC + 时间戳等处理,然后再传递进去,这样的话,就可以降低我们的安全隐患.
总结
- Hash
- 特点
- 算法公开
- 相同的数据加密结果不变,不同的数据加密结果定长
- 不可逆
- HASH用途
- 密码加密:服务器不需要知道用户真实密码,只需要匹配HASH值
- 直接MD5,轻易反查询
- 加盐,不要使用定盐
- HAMC加密方案:通过动态KEY来加密数据
- 加时间戳的方式,更加灵活,可以保证加密的结果每次不同
- 密码加密:服务器不需要知道用户真实密码,只需要匹配HASH值
- 数字签名
- 原始数据进行HASH
- 使用RSA加密HASH值(这部分数据就是原始数据的签名信息)
- 将原始数据+数字签名,一起发给服务器验证
- 特点
- 对称加密算法
- 两种加密方式
- ECB:电子密码本,每一块数据独立加密
- CBC: 链式加密,每一块数据加密都依赖上一块数据。有效的保证数据的完整性
- 两种加密方式
- CCrypt函数:直接使用会有安全隐患
网友评论