前面介绍了openssl 常见的几种对称加密算法的调用方法,这里继续研究一下openssl的单项哈希函数,EVP对加密算法进行了很好的封装,提供了简单易用的调用端口,使用非常方便。
在开头需要说明的一点是,随着计算机计算能力的提升,破解MD5变得门槛越来越低。因此很多文章说SHA更加安全,原因主要是SHA的哈希值更长。
但如果使用穷举破解时,需要遍历原数据的空间,如果MD5与SHA的计算速度相差不大的时候,是否意味着MD5与SHA在穷举面前被破译的概率都是一样的呢?
本文将介绍的哈希算法有 MD5/SHA系列/DSS/RIPEMD160 ,调用逻辑非常简单,请看代码:
#include
#include "evp.h"
#include
int get_digest(const EVP_MD *type,char *s_buf,int s_len,char *d_buf,int *d_len,char *msg){
int i,ret = 0;
EVP_MD_CTX ctx;
EVP_MD_CTX_init(&ctx);
EVP_DigestInit_ex(&ctx,type,NULL);
EVP_DigestUpdate(&ctx,s_buf,s_len);
EVP_DigestFinal_ex(&ctx,d_buf,d_len);
EVP_MD_CTX_cleanup(&ctx);
fprintf(stderr,"%s message:[%s]\ndigestlen:[%d]digest:[",msg,s_buf,*d_len);
for(i=0;i<*d_len;i++){
fprintf(stderr,"%02X",*(d_buf+i));
}
fprintf(stderr,"]\n");
return ret;
}
int main(){
char s_buf[] = "admin";
char d_buf[10000];
int s_len = strlen(s_buf);
int d_len = 10000;
//get_digest(EVP_md_null(),s_buf,&s_len,d_buf,&d_len,"md_null");
get_digest(EVP_md2(),s_buf,s_len,d_buf,&d_len,"md2");
get_digest(EVP_md5(),s_buf,s_len,d_buf,&d_len,"md5");
get_digest(EVP_sha1(),s_buf,s_len,d_buf,&d_len,"sha1");
get_digest(EVP_dss1(),s_buf,s_len,d_buf,&d_len,"dss1");
//get_digest(EVP_mdc2(),s_buf,s_len,d_buf,&d_len,"mdc2");
get_digest(EVP_ripemd160(),s_buf,s_len,d_buf,&d_len,"ripemd160");
get_digest(EVP_sha224(),s_buf,s_len,d_buf,&d_len,"sha224");
get_digest(EVP_sha256(),s_buf,s_len,d_buf,&d_len,"sha256");
get_digest(EVP_sha384(),s_buf,s_len,d_buf,&d_len,"sha384");
get_digest(EVP_sha512(),s_buf,s_len,d_buf,&d_len,"sha512");
return 0;
}
//
// MD5/SHA系列/DSS/RIPEMD160
//
随着计算机计算能力的提升,MD5的安全性越来越低。因此建议使用MD5的时候进行加盐值处理,同样使用SHA或者其他哈希函数时,也需要使用此处理。
建议使用SHA作为哈希算法。减少对MD5的使用。