讯享网
- 算法是公开的
- 对相同数据运算,得到的结果是一样的
- 对不同数据运算,如MD5得到的结果默认是128位,也就是32个字符(16进制标识)
- 无法逆运算
- 主要作为信息摘要,信息指纹,用来做数据识别的
- 用户密码的加密:因为无法还原,所以加密性很好,哪怕泄露了,也午饭逆向出用户的真实密码
- 搜索引擎
- 版权
- 数字签名
- 直接使用MD5
- MD5加盐
- HMAC加密方案
- 添点东西
- 网络上不允许明文传递用户的隐私信息
- 本地不允许明文保存用户隐私信息
- (NSString )md5String {
const char str = self.UTF8String;
uint8_t buffer[CC_MD5_DIGEST_LENGTH];
//将字符串指针、字符串的长度、以及密文存储的空间传进去,空间一般是16位,加密后会把密文以16进制形式放在待存储的空间中,
CC_MD5(str, (CC_LONG)strlen(str), buffer);
//拿到密文后,我们将密文拼接起来就得到一个密文字符串
return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}
- (NSString )stringFromBytes:(uint8_t )bytes length:(int)length {
NSMutableString strM = [NSMutableString string];
for (int i = 0; i < length; i++) {
[strM appendFormat:@“%02x”, bytes[i]];
}
return [strM copy];
}
我们对进行加密:就得到这样一个十六进制的字符串
e10adc3949ba59abbe56e057f20f883e
讯享网
HMAC:
- 使用一个密钥加密,并且做两次散列
- 实际开发中,密钥来自于服务器,动态的
- 一个账号对应一个key,而且还可以更新 我们在注册或者换设备时候将key下发给客户端,然后在本地缓存起来,然后以后每次登陆时候从本地取出来对密码进行加密,这样我们就可以加上一个设备锁,当换设备时候需要原来设备同意才能在新设备上登陆
讯享网
#pragma mark - HMAC 散列函数
- (NSString )hmacMD5StringWithKey:(NSString )key {
const char keyData = key.UTF8String;
const char *strData = self.UTF8String;
uint8_t buffer[CC_MD5_DIGEST_LENGTH];
CCHmac(kCCHmacAlgMD5, keyData, strlen(keyData), strData, strlen(strData), buffer);
return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}
- 1、登录之前先从服务器请求到服务器的时间戳time

- 2、然后在客户端通过HMAC和key对密码进行加密得到密文1
- 3、将密文1拼接上时间戳再进行一次HMAC和key的加密得到密文2
- 4、将密文2传给服务器进行校验,服务器从本地取出用户的密码密文也就是密文1拼接上当前时间戳后再进行HMAC和key的加密跟客户端传过来的进行匹配,相同则校验通过
- 如果不同,则将密文1和服务器时间戳的前一分钟的时间戳拼接后在进行匹配,相同则通过,不同则返回密码不正确
搜索引擎:
版权:
数字签名:
- 可以对支付的信息转成MD5
- 在对MD5密文进行RSA加密得到一个密文,这个就是数字签名
- 传递给服务器后,服务器对密文进行RSA解密得到MD5密文1,再对支付信息转成MD5得到密文2,然后密文1和密文2进行匹配,如果一样,说明支付信息没有被修改
- DES:数据加密标准(用得少,因为强度不够)
- 3DES:用三个密钥对相同数据执行3次加密,强度增强,但是有3个密钥比较麻烦,所有用的比较少
- AES:高级密码标准,钥匙串访问就是使用这个,FBI加密用的也是这个
- ECB:电子密码本模式,每一块数据独立加密。最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,因为每一块数据都是单独的,所以容易受到密码本重放攻击,一般情况很少用
- CBC:密码分组链接模式,使用一个密钥和一个初始化向量(IV)对数据执行加密,明文被加密前要与前面的密文进行异或或运算后再加密,因此只要选择不同的初始向量,相同的密码加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但是如果一个分组丢失,后面的分组将全部作废,也就是数据都是相关联的,后面一块数据的加解密依赖于前一块数据,如果其中一块数据遭到破坏,那么整个数据都无法解析
- CBC可以有效的保证密文的完整性,如果一个数据块在传递时丢失或者改变了,后面的数据将无法正常解密
/
* 终端测试指令
*
* DES(ECB)加密
* \( echo -n hello | openssl enc -des-ecb -K -nosalt | base64<br /> *<br /> * DES(CBC)加密<br /> * \) echo -n hello | openssl enc -des-cbc -iv 00708 -K -nosalt | base64
*
* AES(ECB)加密
* \( echo -n hello | openssl enc -aes-128-ecb -K -nosalt | base64<br /> *<br /> * AES(CBC)加密<br /> * \) echo -n hello | openssl enc -aes-128-cbc -iv 00708 -K -nosalt | base64
*
* DES(ECB)解密
* \( echo -n HQr0Oij2kbo= | base64 -D | openssl enc -des-ecb -K -nosalt -d<br /> *<br /> * DES(CBC)解密<br /> * \) echo -n alvrvb3Gz88= | base64 -D | openssl enc -des-cbc -iv 00708 -K -nosalt -d
*
* AES(ECB)解密
* \( echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K -nosalt -d<br /> *<br /> * AES(CBC)解密<br /> * \) echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 00708 -K -nosalt -d
*
* 提示:
* 1> 加密过程是先加密,再base64编码
* 2> 解密过程是先base64解码,再解密
*/
加密代码:
讯享网
/ 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]);
- (NSString )encryptString:(NSString )string keyString:(NSString )keyString iv:(NSData )iv {
// 设置秘钥
NSData keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding];
uint8_t cKey[self.keySize];
bzero(cKey, sizeof(cKey));
[keyData getBytes:cKey length:self.keySize];
// 设置iv
uint8_t cIv[self.blockSize];
bzero(cIv, self.blockSize);
int option = 0;
if (iv) {
[iv getBytes:cIv length:self.blockSize];
option = kCCOptionPKCS7Padding;
} else {
option = kCCOptionPKCS7Padding | kCCOptionECBMode;
}
// 设置输出缓冲区
NSData data = [string dataUsingEncoding:NSUTF8StringEncoding];
size_t bufferSize = [data length] + self.blockSize;
void buffer = malloc(bufferSize);
// 开始加密
size_t encryptedSize = 0;
//加密解密都是它 – CCCrypt
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
self.algorithm,
option,
cKey,
self.keySize,
cIv,
[data bytes],
[data length],
buffer,
bufferSize,
&encryptedSize);
NSData result = nil;
if (cryptStatus == kCCSuccess) {
result = [NSData dataWithBytesNoCopy:buffer length:encryptedSize];
} else {
free(buffer);
NSLog(@“[错误] 加密失败|状态编码: %d”, cryptStatus);
}
return [result base64EncodedStringWithOptions:0];
}
- (NSString )decryptString:(NSString )string keyString:(NSString )keyString iv:(NSData )iv {
// 设置秘钥
NSData keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding];
uint8_t cKey[self.keySize];
bzero(cKey, sizeof(cKey));
[keyData getBytes:cKey length:self.keySize];
// 设置iv
uint8_t cIv[self.blockSize];
bzero(cIv, self.blockSize);
int option = 0;
if (iv) {
[iv getBytes:cIv length:self.blockSize];
option = kCCOptionPKCS7Padding;//CBC 加密!
} else {
option = kCCOptionPKCS7Padding | kCCOptionECBMode;//ECB加密!
}
// 设置输出缓冲区
NSData data = [[NSData alloc] initWithBase64EncodedString:string options:0];
size_t bufferSize = [data length] + self.blockSize;
void *buffer = malloc(bufferSize);
// 开始解密
size_t decryptedSize = 0;
/CCCrypt 对称加密算法的核心函数(加密/解密)
参数:
1、kCCEncrypt 加密/kCCDecrypt 解密
2、加密算法、默认的 AES/DES
3、加密方式的选项
kCCOptionPKCS7Padding | kCCOptionECBMode;//ECB加密!
kCCOptionPKCS7Padding;//CBC 加密!
4、加密密钥
5、密钥长度
6、iv 初始化向量,ECB 不需要指定
7、加密的数据
8、加密的数据长度
9、缓冲区(地址),存放密文的
10、缓冲区的大小
11、加密结果大小
/
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
self.algorithm,
option,
cKey,
self.keySize,
cIv,
[data bytes],
[data length],
buffer,
bufferSize,
&decryptedSize);
NSData result = nil;
if (cryptStatus == kCCSuccess) {
result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize];
} else {
free(buffer);
NSLog(@“[错误] 解密失败|状态编码: %d”, cryptStatus);
}
return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
}
作者 | iOS_大书 链接 | 点击左下方的 ‘’ 阅读原文 ’’ 可进入作者主页
-End-
最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

面试题】即可获取

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/206743.html