openssl evp 哈希算法(md5,sha1,sha256)
1. 简述
openssl提供了丰富密码学工具,一些常用的哈希算法
比如md5,sha 可以直接用提供的md5.h ,sha.h 接口使用;
为了方便开发者使用,openssl 又提供了一个EVP, evp.h 该文件中提供各种常用工具;
man evp 可以得知,evp 是openssl 提供的更高一级的密码学工具,
可以理解为对提供的各种接口的一个封装
EVP文件包含的比较多,本次主要说明EVP提供的哈希算法
2. 示例 sha512代码
使用需要导入evp.h
//初始化
EVP_MD_CTX *evpCtx = EVP_MD_CTX_new();
EVP_DigestInit_ex(evpCtx, EVP_sha512(), NULL);
char *data = (char *)"hello";
unsigned int len = strlen(data);
//hash计算
EVP_DigestUpdate(evpCtx, data , len);
unsigned char result[SHA512_DIGEST_LENGTH] = {};
//返回结果
EVP_DigestFinal_ex(evpCtx, result, &len);
hex_print("sha512", result, SHA512_DIGEST_LENGTH); //直接使用一个函数
unsigned char resultT[SHA512_DIGEST_LENGTH] = {};
EVP_Digest("hello", , resultT, NULL, EVP_sha512(), NULL);
hex_print("sha512", resultT, SHA512_DIGEST_LENGTH);
上述测试EVP提供的两种方式来进行sha512
3. 根据evp.h提供的内部可知:
上述使用的是EVP_512();那么其他的还有:
const EVP_MD *EVP_md2(void);
const EVP_MD *EVP_md4(void);
const EVP_MD *EVP_md5(void);
const EVP_MD *EVP_md5_sha1(void);
const EVP_MD *EVP_blake2b512(void);
const EVP_MD *EVP_blake2s256(void);
const EVP_MD *EVP_sha1(void);
const EVP_MD *EVP_sha224(void);
const EVP_MD *EVP_sha256(void);
const EVP_MD *EVP_sha384(void);
const EVP_MD *EVP_sha512(void);
定义的hash算法的计算长度
# define SHA224_DIGEST_LENGTH
# define SHA256_DIGEST_LENGTH
# define SHA384_DIGEST_LENGTH
# define SHA512_DIGEST_LENGTH
4. 如果不用EVP提供的,还可以直接使用openssl提供的其他接口
md5.h, sha.h
如sha.h 中关于 sha512提供的接口
int SHA384_Init(SHA512_CTX *c);
int SHA384_Update(SHA512_CTX *c, const void *data, size_t len);
int SHA384_Final(unsigned char *md, SHA512_CTX *c);
unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md);
int SHA512_Init(SHA512_CTX *c);
int SHA512_Update(SHA512_CTX *c, const void *data, size_t len);
int SHA512_Final(unsigned char *md, SHA512_CTX *c);
unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md);
调用的时候同样有两种方式;如下示例
//初始化
SHA512_CTX ctx;
SHA512_Init(&ctx);
char *data = (char *)"hello";
unsigned int len = strlen(data);
unsigned char result[SHA512_DIGEST_LENGTH] = {};
//计算哈希
SHA512_Update(&ctx, data, len);
//取结果
SHA512_Final(result, &ctx);
hex_print("sha512", result, SHA512_DIGEST_LENGTH); //一个函数调用
unsigned char resultT[SHA512_DIGEST_LENGTH] = {};
SHA512("hello", , resultT);
hex_print("sha512", resultT, SHA512_DIGEST_LENGTH);
5. 最后附上,上述例子中的hex_print代码
static void hex_print(const char *name, const unsigned char *buf, size_t len)
{
size_t i;
fprintf(stderr, "%s ", name);
for (i = ; i < len; i++)
fprintf(stderr, "%02X", buf[i]);
fputs("\n", stderr);
}
参考:
测试使用 openssl 1.1.0c
openssl evp 哈希算法(md5,sha1,sha256)的更多相关文章
- 哈希算法MD5和SHA1的C#实现
/* * 哈希算法MD5和SHA1的C#实现 * * * 夏春涛 Email:xChuntao@163.com * Blog:http://bluesky521.cnblogs.com * 运行 ...
- MD5 SHA1 SHA256 SHA512 SHA1WithRSA 的区别
MD5 SHA1 SHA256 SHA512 这4种本质都是摘要函数,不通在于长度 MD5 是 128 位,SHA1 是 160 位 ,SHA256 是 256 位,SHA512 是512 位. ...
- Hash校验工具、MD5 SHA1 SHA256命令行工具
MyHash 检验工具http://www.zdfans.com/html/4346.html HashMyFiles Hash校验工具http://www.nirsoft.net/utils/has ...
- 文件 MD5 SHA1 SHA256 SHA512 校验码生成工具 V1.3
[程序介绍]免费开源的 文件 MD5 SHA1 SHA256 SHA512 校验码生成工具 V1.3 这是一个有意思的程序,同一个程序,即是图形程序,又是命令行程序.程序作用:输入一个文件的路径,输出 ...
- Windows自带MD5 SHA1 SHA256命令行工具
感恩大佬LiuYanYGZ的文章 MyHash 检验工具http://www.zdfans.com/html/4346.html HashMyFiles Hash校验工具http://www.nirs ...
- You shouldn't use *any* general-purpose hash function for user passwords, not BLAKE2, and not MD5, SHA-1, SHA-256, or SHA-3
hashlib - Secure hashes and message digests - Python 3.8.3 documentation https://docs.python.org/3.8 ...
- 哈希加密算法 MD5,SHA-1,SHA-2,SHA-256,SHA-512,SHA-3,RIPEMD-160 - aTool
一.MD5哈希加密算法 atool.org MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致.是计算机广泛使用的散列算法之一(又译摘要算法. ...
- 转载:哈希加密算法 MD5,SHA-1,SHA-2,SHA-256,SHA-512,SHA-3,RIPEMD-160 - aTool
http://www.atool.org/hash.php 一.MD5哈希加密算法 MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致.是计算 ...
- asp中的md5/sha1/sha256算法收集
对于asp这种古董级的技术,这年头想找一些有用的资料已经不容易了,下面是一些常用的加密算法: md5 (将以下代码另存为md5.inc) <% Private Const BITS_TO_A_B ...
随机推荐
- c#:浅克隆和深克隆,序列化和反序列化
一.浅克隆和深克隆(浅复制和深复制)浅克隆和深克隆最典型的应用是数据集对象DataSet的Clone和Copy方法.Clone()方法用来复制DataSet的结构,但是不复制DataSet的数据,实现 ...
- svn更新报错:svn unable to connect to a repository at url
出现错误:unable to connect to a repository at url 解决办法1. 右键点击本地副本,TortoiseSVN -> Settings -> Saved ...
- Netty之Java堆外内存扫盲贴
Java的堆外内存本来是高贵而神秘的东西,只在一些缓存方案的收费企业版里出现.但自从用了Netty,就变成了天天打交道的事情,毕竟堆外内存能减少IO时的内存复制,不需要堆内存Buffer拷贝一份到直接 ...
- 使用ScheduledExecutorService实现Timer
大家都说Timer不太好用,经常会遇到:如果前边的一个任务比较慢,超出了period,此时timer的下一次轮询也会延迟. 同事说ScheduleExecutorService可以避免该问题,我写个例 ...
- Salesforce select字段的多少对性能影响巨大
Salesforce select字段的多少对性能影响巨大,第1个是select 144个字段,第2个是select 5个字段, 性能相差了7倍 "select Id,IsDeleted,M ...
- css巧妙实现分隔线
单个标签实现分隔线 .demo_line_01{ padding: 0 20px 0; margin: 20px 0; line-height: 1px; border-left: 200px sol ...
- SVN----------项目服务器上的svn客户端自动更新设置。
1.局域网服务器上搭建了PHP项目运行的环境,然后怎么样讲根目录拉去到的项目可以随着开发人员提交的代码,自动更新成最新的代码. 2.首先将svn版本库上的代码拉取到www目录下或者你的根目录. 3.然 ...
- Bootstrap 响应式设计
本教程讲解如何在网页布局中应用响应式设计.在课程中,您将学到响应式 Web 设计.随着移动设备的普及,如何让用户通过移动设备浏览您的网站获得良好的视觉效果,已经是一个不可避免的问题了.响应式 Web ...
- ThinkPHP讲解(十一)——验证码和文件上传
一.验证码 1.页面前端显示 (验证码是图片标签,来源是控制器里的yzm()操作方法) <h1>登录</h1> <form action="__ACTION__ ...
- Java 可变参数列表
1.可变参数列表的简单实现 当调用方法时,方法的参数个数或类型未知时,称其为可变参数列表.在以前的Java代码中,可以使用Object数组来实现这样的功能.因为,所有的类都是直接或间接继承于Objec ...