Chinaunix首页 | 论坛 | 博客
  • 博客访问: 429500
  • 博文数量: 127
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 810
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-02 20:51
文章分类

全部博文(127)

文章存档

2018年(6)

2015年(18)

2014年(33)

2013年(70)

分类: LINUX

2014-07-31 09:40:09

原文地址:OpenSSL之计算SHA1散列值 作者:remimin

SHA1散列函数是很常用的散列函数,它产生160bit(20字节)长度的散列值。

今天,我就来介绍利用OpenSSL现成的API来计算数据的SHA1散列值。

先来看OpenSSL的相关API声明:

 

  1. #include   
  2.  unsigned char *SHA1(const unsigned char *d, unsigned long n,  
  3.                   unsigned char *md);  
  4.  int SHA1_Init(SHA_CTX *c);  
  5.  int SHA1_Update(SHA_CTX *c, const void *data,  
  6.                   unsigned long len);  
  7.  int SHA1_Final(unsigned char *md, SHA_CTX *c); 

这里有2个(套)API可以来计算数据的SHA1散列值。

最先的SHA1函数很直白,参数d是数据块的起始地址,n是数据块的长度,计算的散列值存储在参数md指向的内存中。如果md为NULL,那么SHA1函数会把计算得到的散列值存储在函数内部的静态空间内,然后通过函数返回值返回给我们。刚才我们说过SHA1散列值的长度为20字节,所以md至少需要拥有20字节的空间大小。当然,OpenSSL已经为我们定义了常量SHA_DIGEST_LENGTH。

 

对于第二套API,我们看到由3个函数组成。粗粗一看,有些看客会觉得3个函数不就是完成SHA1函数的功能吗?为什么要搞3个函数来啊?呵呵,OpenSSL显然是有充分的理由来这么做的。这么做的关键是SHA1_Update这个函数可以被调用多次,这些待计算散列值的数据会被叠加,最终产生一个散列值。也许有人现在还没想到它的使用场景,我下面来举个例子点破。

 

比如一个文件大小为6GB,我们知道32位程序无法访问大于4GB的内存空间(其实程序员可以操作的最多也就3GB,程序/数据/栈/保护区等会占用1GB左右的空间),这时如何计算这个文件的散列值?SHA1肯定是不行的了。这时我们可以分N次来读这个文件,每次读1MB的数据,然后调用SHA1_Update函数来累计计算散列值,读完文件的所有数据后,我们再调用SHA1_Final函数来得到最终的散列值。

 

怎么样?简单吧,贪多嚼不烂,今天就到这里

阅读(2666) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~