单向散列值 哈希算法

文章目录
单向散列函数(one-)有一个输人和一个输出,其中输人称为消息(),输出称为散列值() 。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性 。
哈希的特点常用哈希算法 Md4、Md5
MD4是由于1990年设计的单向散列函数,能够产生128比特的散列值(,修订版) 。不过,随着提出寻找MD4散列碰撞的方法,因此现在它已经不安全了 。
MD5是由Rwest于1991年设计的单向散列函数,能够产生128比特的散列值() 。
MD5的强抗碰撞性已经被攻破,也就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此它也已经不安全了 。
MD4和MD5中的MD是消息摘要( )的缩写 。
SHA-1、SHA-256、SHA-384、SHA-512
SHA-1是由NIST(Of,美国国家标准技术研究所)设计的一种能够产生160比特的散列值的单向散列函数 。1993年被作为美国联邦信息处理标准规格(FIPS PUB 180)发布的是SHA,1995年发布的修订版FIPS PUB 180-1称为SHA-1 。
SHA-1的消息长度存在上限,但这个值接近于264比特,是个非常巨大的数值,因此在实际应用中没有问题 。
SHA-256、SHA-384和SHA-512都是由NIST设计的单向散列函数,它们的散列值长度分别为256比特、384比特和512比特 。这些单向散列函数合起来统称SHA-2,它们的消息长度也存在上限(SHA-256的上限接近于 264 比特,SHA-384 和 SHA-512的上限接近于 2128 比特) 。这些单向散列函数是于2002年和 SHA-1 一起作为 FIPS PUB 180-2发布的 SHA-1 的强抗碰撞性已于2005年被攻破, 也就是说,现在已经能够产生具备相同散列值的两条不同的消息 。不过,SHA-2还尚未被攻破 。
哈希函数散列值长度(bit)散列值长度(byte)
Md4/Md5
SHA-1
SHA-256

单向散列值  哈希算法

文章插图
SHA-384
SHA-512
SHA-224
上述散列值长度为二进制数据长度 。通常散列值采用 16 进制格式的数字串进行表示,因此看到的字符串长度是原来的2倍长.
MD5相关函数和测试 使用的头文件
#
#
// 相关操作函数 —— openssl中返回int: 成功:1(true)失败:0(false)// 定义md5 使用的 结构体MD5_CTX c;// 初始化 md5 使用的结构体 。int MD5_Init(MD5_CTX *c);MD5_Init(&c);// 向md5中添加待生成散列值的原始数据 。—— 可以反复调用 update,反复添加数据 。int MD5_Update(MD5_CTX *c, const void *data, size_t len);参1:&c参2:待进行散列运算的元素数据 。—— 可以重复添加 。参3:data的长度 。// 生成 md5 散列值 int MD5_Final(unsigned char *md, MD5_CTX *c);参1:传出参数 。散列值数据 。参2:&c// 只能一次性添加待散列的数据 。生成md5散列值unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);参1:待运算的原始数据参2:d的长度 。参3:传出参数 。生成的散列值 。返回值:生成的散列值 。
示例
#include#include#include?#include ?//MD5算法int main(){int ret = -1;int i = 0;char *data = "http://www.kingceram.com/post/hello";//保存MD5散列值char md[MD5_DIGEST_LENGTH + 1];MD5_CTX c;//1. 初始化ret = MD5_Init(&c);//2. 添加数据ret = MD5_Update(&c, data, strlen(data));//3. 计算结果memset(md, 0, MD5_DIGEST_LENGTH + 1);ret = MD5_Final(md, &c);//printf("MD5: %s\n", md);for (i = 0; i < MD5_DIGEST_LENGTH; i++){printf("x", (unsigned char)md[i]);}putchar('\n');?printf("==============================\n");//生成MD5散列值memset(md, 0, MD5_DIGEST_LENGTH + 1);MD5(data, strlen(data), md);for (i = 0; i < MD5_DIGEST_LENGTH; i++){printf("x", (unsigned char)md[i]);}putchar('\n');?return 0;}