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 ...
随机推荐
- elasticsearch使用操作部分
本片文章记录了elasticsearch概念.特点.集群.插件.API使用方法. 1.elasticsearch的概念及特点.概念:elasticsearch是一个基于lucene的搜索服务器.luc ...
- DIA
Dia Tutorial: http://www.seanet.com/~hgg9140/comp/diatut/all/all.html Dia Tutorial
- JVM最多能创建多少个线程:unabletocreatenewnativethread
最近需要测试一个长连接服务器,数据上需要达到100W的长连接,测试的客户端,一个线程保持一个连接,发现linux服务器默认创建到3200多个线程的时候,就会报错这个错误“java.lang.OutOf ...
- iOS小技巧3
将颜色合成图片 将颜色合成图片 +(UIImage *)imageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, 1 ...
- Oracle事务之一:锁和隔离
Oracle事务之一:锁和隔离 一. 事务概述 事务管理是数据库处理的核心.数据库既要保证用户能并发地执行事务,还要保证数据库的一致性. 当第一条可执行的SQL开始执行,就隐形地开始了一个事务,直到遇 ...
- Webstorm的序列号和证书
User Name: ------------name-------------- EMBRACE -------------name-------------- License Key: ===== ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数011,ocr,字符识别
<zw版·Halcon-delphi系列原创教程> Halcon分类函数011,ocr,字符识别 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...
- Grunt备忘录
一.安装Grunt 应在全局环境下安装Grunt,以保障在任何目录下都能够正确找到grunt npm install grunt-cli -g 二.对已有Grunt基本目录结构文件进行操作 Grunt ...
- Ninject简介
1.为什么要用Ninject? Ninject是一个IOC容器用来解决程序中组件的耦合问题,它的目的在于做到最少配置.其他的的IOC工具过于依赖配置文件,需要使用assembly-qualified名 ...
- Unity3D UGUI学习系列索引(暂未完成)
U3D UGUI学习1 - 层级环境 U3D UGUI学习2 - Canvas U3D UGUI学习3 - RectTransform U3D UGUI学习4 - Text U3D UGUI学习5 - ...