单向散列算法运算速度实测

测试环境:CentOS 6.4 X86_64位 VMWare虚拟机 1G RAM  (物理主机CPU i7-3770 3.4GHz)

测试代码(使用openssl的hash库):

#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
#include <ctime>
#include <stdio.h>
using namespace std;

#include <openssl/sha.h>
#include <openssl/md5.h>

string md5(const string str)
{
    unsigned char hash[MD5_DIGEST_LENGTH];
    MD5_CTX md5;
    MD5_Init(&md5);
    MD5_Update(&md5, str.c_str(), str.size());
    MD5_Final(hash, &md5);
    stringstream ss;

    for(int i = 0; i < MD5_DIGEST_LENGTH; i++)
    {
        ss << hex << setw(2) << setfill(‘0‘) << (int)hash[i];
    }
    return ss.str();
}

string sha256(const string str)
{
    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, str.c_str(), str.size());
    SHA256_Final(hash, &sha256);
    stringstream ss;

    for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) //32
    {
        ss << hex << setw(2) << setfill(‘0‘) << (int)hash[i];
    }
    return ss.str();
}

string sha512(const string str)
{
    unsigned char hash[SHA512_DIGEST_LENGTH];
    SHA512_CTX sha512;
    SHA512_Init(&sha512);
    SHA512_Update(&sha512, str.c_str(), str.size());
    SHA512_Final(hash, &sha512);
    stringstream ss;
    for(int i = 0; i < SHA512_DIGEST_LENGTH; i++) //64
    {
        ss << hex << setw(2) << setfill(‘0‘) << (int)hash[i];
    }
    return ss.str();
}

int main()
{
    //MD5
    time_t t1=time(0);
    cout << "MD5:" << endl;
    cout << t1 << endl;
    for(int i=0;i<10000000;i++)
    {
        char pwd[32];
        sprintf(pwd, "%d", i);
        md5(pwd);
    }
    time_t t2=time(0);
    cout << t2 << endl;
    cout << t2-t1 <<endl;

    //SHA256
    t1=time(0);
    cout << "SHA256:" << endl;
    cout << t1 << endl;
    for(int i=0;i<10000000;i++)
    {
        char pwd[32];
        sprintf(pwd, "%d", i);
        sha256(pwd);
    }
    t2=time(0);
    cout << t2 << endl;
    cout << t2-t1 <<endl;

    //SHA512
    t1=time(0);
    cout << "SHA512:" << endl;
    cout << t1 << endl;
    for(int i=0;i<10000000;i++)
    {
        char pwd[32];
        sprintf(pwd, "%d", i);
        sha512(pwd);
    }
    t2=time(0);
    cout << t2 << endl;
    cout << t2-t1 <<endl;

    return 0;
}

编译:  g++ -o sha sha.cpp -lssl -lcrypto

运行:  ./sha

结果:

MD5:
1409193206
1409193228
22
SHA256:
1409193228
1409193263
35
SHA512:
1409193263
1409193318
55

分别执行了1000万次HASH运算, MD5用了22秒, SHA256用了35秒,SHA512用了55秒。

运算时间基本处于同一量级,使用SHA256或SHA512代替MD5是非常必要的。

因环境差异对结果影响较大,数据仅供备忘和参考。

时间: 2024-10-12 13:38:10

单向散列算法运算速度实测的相关文章

MD5(单向散列算法)原理分析

注:本文章转载于网络. MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能:    输入任意长度的信息,经过处理,输出为128位的信息(数字指纹):    不同的输入得到的不同的结果(唯一性):    根据128位的输出结果不可能反推出输入的信息(不可逆): MD5属不属于加密算法:    认为不属于的人是因为他们觉得不能从密文(散列值)反过来得到原文,即没有

数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)

数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4. 鲍勃收信后,用私钥解密,看到信件内容. 5. 鲍勃给苏珊回信,写完后用Hash函数,生成信件的摘要(digest). 6. 然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature). 7. 鲍勃将这个签名,附在信件下面,一起发给苏珊. 8. 苏珊收信后,取下数

【Java-加密算法】对称加密、非对称加密、单向散列

一提到加密,就会联想到数字签名,这两个经常被混淆的概念到底是什么呢? 加密:加密是一种以密码方式发送信息的方法.只有拥有正确密钥的人才能解开这个信息的密码.对于其他人来说,这个信息看起来就像是一系列随机的字母.数字和符号.如果你要发送不应该让其他人看的敏感信息时,加密是特别重要的. 数字签名:数字签名是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法.一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证. 加密与数字签名的区别 加密同数字签名

加密散列算法——MD5

引用wiki的定义,散列函数(或散列算法,英语:Hash Function)是一种从任何一种数据中创建小的数字"指纹"的方法.该函数将数据打乱混合,重新创建一个叫做散列值的指纹.散列值通常用来代表一个短的随机字母和数字组成的字符串.好的散列函数在输入域中很少出现散列冲突.在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到.(具体专业术语请自行度娘) MD5是单向散列算法的一种,全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD

Android数据加密之SHA安全散列算法

前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好奇心,所以趁着晚上没啥事,来学习一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 Android数据加密之Des加密 Android数据加密之MD5加密 Android数据加密之Base64编码算法 SHA加密算法 SHA(Secure Hash A

对称密码、非对称密码、散列算法与PKI

对称密码.非对称密码.散列算法与PKI 密码学要解决的问题:机密性.完整性.身份验证(抗抵赖性): 一.对称密码: 对称密码技术:发件人和收件人使用其共同拥有的单个密钥 ,这种密钥既用于加密,也用于解密,叫做机密密钥(也称为对称密钥或会话密钥). 能够提供信息机密性(没有密钥信息不能被解密).完整性(被改变的信息不能被解密)的服务. 对称式密码学又称:单钥密码学.秘密密钥密码学.会话密钥密码学.私钥密码学.共享秘钥密码学  常见的对称式加密技术: DES(数据加密标准):分组式加密,算法源于Lu

单向散列加密

开发中有一种场景,就是只需要验证正确性而不需要知道它的原文,只需要知道这个值是否存在是否相等就可以了.比如前端登录将用户的密码加密给服务端并存储到数据库.或者验证文件唯一性等.这时就要用到单向散列加密. 单向散列函数特点 1. 对任意长度的消息散列值是定长的. 2. 散列计算速度快,非常高效. 3. 明文不同,散列加密后的密文一定不同:明文相同,散列加密后密文一定相同. 4. 具备单向性,无法逆推计算. 单向散列函数也被称为哈希函数,摘要函数或者杂凑函数.其经典算法有 md5 | sha | s

散列函数之单散列算法解决冲突问题

1. 问题 问题同<简单散列函数算法> 设有10个非负整数,用不多于20个的储存单元来存放,如何存放这10个数,使得搜索其中的某一个数时,在储存单元中查找的次数最少? 问题类似于,有10个带号码的球,放到编号为{0, 1, 2, -, 19}共20个盒子中,每个盒子最多放一个,问如何放,使能够用最少的次数打开盒子,知道任一个球所在的盒子编号? 2. 分析 <简单散列函数算法>中,已经分析得出,只要能解决冲突问题,就能将查找时间降为常量范围内. 思路:当一个数发生冲突时,再找一个没有

Java哈希散列算法简介 - MD5 &amp; SHA-512

Java哈希散列算法简介 - MD5 & SHA-512 在日常的开发工作中,我们常常会碰到这样的一个场景:我们需要有一种可靠的行之有效的方法来检验跟判断数据在传输过程当中的完整性.最常见的一种情况就是当我们传输文件的时候,由于网络故障或者其他的一些因素,可能会出现我们下载下来的文件不完整,这给我们日常的开发和维护带了一些难题:另外的一个较为常用的场景就是:有没有一种行之有效的方法让我们可以很方便的判断服务器上的文件是不是有最新的数据更新,比如我们现在的移动Hybird App开发,我们经常会发