• 热门专题

OpenSSL之计算SHA1散列值

作者:remimin博客  发布日期:2012-09-12 09:18:45
Tag标签:OpenSSL  SHA1  
  • SHA1散列函数是很常用的散列函数,它产生160bit(20字节)长度的散列值。

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

    先来看OpenSSL的相关API声明:

     

    #include <openssl/sha.h>  
    unsigned char *SHA1(const unsigned char *d, unsigned long n, unsigned char *md);  
    int SHA1_Init(SHA_CTX *c);  
    int SHA1_Update(SHA_CTX *c, const void *data,unsigned long len);  
    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函数来得到最终的散列值。

延伸阅读:

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规