Hash一般译为“散列”,也有直接音译为“哈希”,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值,简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
Hash的特点
- 算法是公开的
- 对相同数据运算得到的结果是一样的
- 对不同数据运算,如MD5得到的结果默认是128位,32个字符(16进制标识)
- 不可逆运算
-
信息摘要,信息“指纹”,是用来做数据识别的
目前常见的散列算法
Hash的用途
- 用户密码加密:将密码进行加密后存储在服务器,以防止账号信息泄漏。
- 保护资料\版权:散列值可用于唯一地识别机密信息。
- 确保传递真实的信息:消息或数据的接受者确认消息是否被篡改的性质叫数据的真实性,也称为完整性。发信人通过将原消息和散列值一起发送,可以保证真实性。如数字签名
- 搜索引擎:对搜索内容进行分词后使用hash计算出结果的和,然后匹配出搜索结果。
- 语音识别:如分析正在播放的音乐,并将它于存储在数据库中的已知的散列值进行比较。用户就能够收到被识别的音乐的曲名。
在实际应用中,不能直接使用MD5,如果直接使用的话,很可能会被破解,如网站cmd5通过穷举字符组合进行反向查询。所以我们在应用的时候可以使用一些手段,如HMAC
方案,通过加key、时间戳等手段进行二次hash运算。
对称密钥加密
又称为对称加密、私钥加密、共享密钥加密。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。常见的对称加密算法有AES("高级加密标准")、ChaCha20、3DES、Salsa20、DES("数据加密标准")、Blowfish、IDEA( "国际资料加密算法")、RC5、RC6、Camellia
。对称加密的速度比公钥加密快很多,在很多场合都需要对称加密。
对称加密有两种不同的应用模式:
- ECB(Electronic Code Book):电子密码本模式,每一块数据独立加密,它是最基本的加密模式,相同的明文将永远加密成相同的密文。它容易受到密码本重放攻击,一般情况下很少用。
- CBC(Cipher Block Chaining):密码分组链接模式,使用一个密钥和一个初始化向量[IV]对数据执行加密。
明文被加密前要与前面的密文进行异或运算后再密码,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。第一块数据都与前面是关联的,因此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(ECB)加密“hello”字符串
-
解密:
- AES(ECB)解密
echo -n d1QG4T2tivoi0Kiu3NEmZQ== | 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)解密
OC代码使用
引入头文件#import <CommonCrypto/CommonCrypto.h>
,加解密都是使用同一个方法
/*参数说明
1、kCCEncrypt 加密/kCCDecrypt 解密
2、加密算法。
3、加密选项:ECB/CBC,iv存在使用kCCOptionPKCS7Padding,不存在使用kCCOptionPKCS7Padding | kCCOptionECBMode
4、加密的密钥
5、密钥的长度
6、iv 初始化向量
7、加密的数据
8、加密的数据长度
9、密文的内存地址
10、密文缓冲区的大小
11、加密结果大小
*/
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));
网友评论