1:哈希算法特性
-
无论原始数据长度为多少,生成的散列值,长度固定。
-
原始数据发生细微变化,散列值变化巨大。
-
较强的 抗碰撞性。
校验数据是否被篡改。登录校验。秒传。
不同的数据,生成的散列值不同。相同数据生成的散列值一致。 -
不可逆!—— 不能用来加解密
2: 常用哈希算法
- MD5 --得到散列值长度16types --为2进制。
- sh224 --得到散列值长度28types --为2进制。
- sh256 --得到散列值长度32types --为2进制。
- sh384 --得到散列值长度48types --为2进制。
- sh512 --得到散列值长度64types --为2进制。
注意:
上述散列值长度为二进制数据长度
通常散列值采用 16 进制格式的数字串进行表示,字符串长度是原来的2倍长.
3:常用的 OpenSSL 中的函数
MD5
#include <openssl/md5.h>
#include <openssl/sha.h> ---- 头文件
// openssl中: int 类型的返回值:成功:1。失败:0。
// 相关操作函数
// 初始化
int MD5_Init(MD5_CTX *c);
c: 传出。MD5_CTX c; --> &c;
// 添加原始数据
int MD5_Update(MD5_CTX *c, const void *data, size_t len); // 可以调用多次,添加数据
c:传入传出。
data:传入。原始数据。
len:data的长度。
// 生成散列值
int MD5_Final(unsigned char *md, MD5_CTX *c);
md:传出。
// 一步生成散列值。 —— 只能传递一次数据。
unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
d:原始数据。
n:d的长度。
md:散列值。传出。
返回:散列值。返回。```
#### sha 系列
```c
# define SHA_DIGEST_LENGTH 20
# define SHA224_DIGEST_LENGTH 28
# define SHA256_DIGEST_LENGTH 32
# define SHA384_DIGEST_LENGTH 48
# define SHA512_DIGEST_LENGTH 64
int SHA1_Init(SHA_CTX *c);
int SHA1_Update(SHA_CTX *c, const void *data, size_t len);
int SHA1_Final(unsigned char *md, SHA_CTX *c);
unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md);
int SHA224_Init(SHA256_CTX *c);
int SHA224_Update(SHA256_CTX *c, const void *data, size_t len);
int SHA224_Final(unsigned char *md, SHA256_CTX *c);
unsigned char *SHA224(const unsigned char *d, size_t n, unsigned char *md);```
## 4: 哈希算法的应用
+ 主要用于得到数据的散列值
+ 哈希算法不是对数据进行加密