单向散列值 哈希算法( 二 )


SHA1相关函数和测试

单向散列值  哈希算法

文章插图
typedef struct SHAstate_st {SHA_LONG h0, h1, h2, h3, h4;SHA_LONG Nl, Nh;SHA_LONG data[SHA_LBLOCK];unsigned int num;} SHA_CTX;?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);void SHA1_Transform(SHA_CTX *c, const unsigned char *data);
示例
#include#include#include?#include ??int main(){int ret = -1;int i = 0;?SHA_CTX ctx;?char *data = "http://www.kingceram.com/post/hello";?unsigned char md[SHA_DIGEST_LENGTH + 1];?//1. 初始化ret = SHA1_Init(&ctx);if (1 != ret){printf("SHA1_Init failed...\n");return 1;}?//2. 添加数据ret = SHA1_Update(&ctx, data, strlen(data));if (1 != ret){printf("SHA1_Update failed...\n");return 1;}?//3. 计算结果memset(md, 0, SHA_DIGEST_LENGTH + 1);ret = SHA1_Final(md, &ctx);if (1 != ret){printf("SHA1_Final failed...\n");return 1;}?for (i = 0; i < SHA_DIGEST_LENGTH; i++){printf("x", (unsigned char)md[i]);}putchar('\n');?printf("==================================\n");?//计算散列值memset(md, 0, SHA_DIGEST_LENGTH + 1);SHA1(data, strlen(data), md);?for (i = 0; i < SHA_DIGEST_LENGTH; i++){printf("x", (unsigned char)md[i]);}putchar('\n');return 0;}
哈希函数的应用 检测软件是否被篡改
我们可以使用单向散列函数来确认自己下载的软件是否被篡改 。
很多软件,尤其是安全相关的软件都会把通过单向散列函数计算出的散列值公布在自己的官方网站上 。用户在下载到软件之后,可以自行计算散列值,然后与官方网站上公布的散列值进行对比 。通过散列值,用户可以确认自己所下载到的文件与软件作者所提供的文件是否一致 。
这样的方法,在可以通过多种途径得到软件的情况下非常有用 。为了减轻服务器的压力,很多软件作者都会借助多个网站(镜像站点)来发布软件,在这种情况下,单向散列函数就会在检测软件是否被篡改方面发挥重要作用 。
消息认证码
使用单向散列函数可以构造消息认证码 。
消息认证码是将“发送者和接收者之间的共享密钥”和“消息,进行混合后计算出的散列值 。使用消息认证码可以检测并防止通信过程中的错误、篡改以及伪装 。
【单向散列值哈希算法】数字签名
在进行数字签名时也会使用单向散列函数 。
数字签名是现实社会中的签名(sign)和盖章这样的行为在数字世界中的实现 。数字签名的处理过程非常耗时,因此一般不会对整个消息内容直接施加数字签名,而是先通过单向散列函数计算出消息的散列值,然后再对这个散列值施加数字签名 。
伪随机数生成器
使用单向散列函数可以构造伪随机数生成器 。
密码技术中所使用的随机数需要具备“事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质 。为了保证不可预测性,可以利用单向散列函数的单向性 。
一次性口令或登录验证
使用单向散列函数可以构造一次性口令(one-time ) 。
一次性口令经常被用于服务器对客户端的合法性认证 。在这种方式中,通过使用单向散列函数可以保证口令只在通信链路上传送一次(one-time),因此即使窃听者窃取了口令,也无法使用 。