计算指定字符串的md5值是一项很常见的操作,包括使用命令行md5sum,或者在C/C++编程中调用openssl提供的接口函数来进行。下面我们分别阐述如下:

一、在命令行中使用md5校验

计算某个文件的md5校验值,通常就是在命令行输入md5sum就可以了

但是如果要方便地计算一个给出字符串的md5值,则md5sum就不合适了,因为md5sum只针对文件操作。为此我想到下面的变通方法:

在/usr/bin下面编写一个bash脚本

sudo vim md5

#!/bin/bash
echo -n $1 | md5sum | awk '{print $1}'

保存后,赋予可执行权限

sudo chmod +x md5

这样就可以方便地计算任意字符串的值了。参见如下截图

二、使用OpenSSL中md5接口编程(使用MD5加密)

  我们以一个字符串为例,新建一个文件filename.txt,在文件内写入hello ,然后在Linux下可以使用命令md5sum filename.txt计算md5值 ==> b1946ac92492d2347c6235b4d2611184  。虽然写入的是hello这5个字符,但是我们使用命令xxd filename.txt后可以看出文件结尾处会有个0x0a这个回车符。所以在下面的代码中才会有\n。

下面是提供的md5函数的接口

//打开/usr/include/openssl/md5.h这个文件我们可以看到一些函数
// 初始化 MD5 Contex, 成功返回1,失败返回0
int MD5_Init(MD5_CTX *c);
// 循环调用此函数,可以将不同的数据加在一起计算MD5,成功返回1,失败返回0
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
// 输出MD5结果数据,成功返回1,失败返回0
int MD5_Final(unsigned char *md, MD5_CTX *c);
// MD5_Init,MD5_Update,MD5_Final三个函数的组合,直接计算出MD5的值
unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
// 内部函数,不需要调用
void MD5_Transform(MD5_CTX *c, const unsigned char *b);

下面是分别针对字符串和本地文件的源码

str_md5_demo.c文件:

//gcc -g str_md5_demo.c -o str_md5_demo -lcrypto
//
#include <string.h>
#include <stdio.h>
#include <openssl/md5.h>int main(int argc, char* argv[]){MD5_CTX ctx;unsigned char md[16] = {0};int i = 0;//方法一:MD5_Init(&ctx);MD5_Update(&ctx, "hel", 3);MD5_Update(&ctx, "lo", 2);MD5_Final(md, &ctx);for (i = 0; i < 16; i++)printf("%02X", md[i]);printf("\n");//方法二:const char data[] = "hello";MD5(data, strlen(data), md);for (i = 0; i < 16; i++)printf("%02X", md[i]);printf("\n");return 0;
}

file_md5_demo.c:

//gcc -g file_md5_demo.c -o file_md5_demo -lcrypto
//#include <string.h>
#include <stdio.h>
#include <openssl/md5.h>int main(int argc, char* argv[]){MD5_CTX ctx;unsigned char md[16] = {0};char buffer[1024] = {0};char filename[64] = {0};int len = 0, i;FILE* fp = NULL;printf("请输入文件名, 用于计算MD5值\n");scanf("%s", filename);fp = fopen(filename, "rb");if(NULL == fp){printf("can't open file\n");return 1;}//方法一:MD5_Init(&ctx);while((len=fread(buffer, 1, sizeof(buffer), fp)) > 0){MD5_Update(&ctx, buffer, len);memset(buffer, 0 ,sizeof(buffer));}MD5_Final(md, &ctx);for(i=0; i<16; i++)printf("%02X", md[i]);printf("\n");//方法二:while((len=fread(buffer, 1, sizeof(buffer), fp)) > 0){MD5(buffer, len, md);memset(buffer, 0 ,sizeof(buffer));}for(i=0; i<16; i++)printf("%02X", md[i]);printf("\n");if(fp) fclose(fp);return 0;
}

下面是运行效果截图, 同时给出了与md5或是md5check的对比图:

这里要说明如下几点:
1.md5接口的调用有两套,一套是 MD5_Init,MD5_Update,MD5_Final,另一套是MD5,用哪一套都可以的。两种实现方式,一样的结果。相比较,第二种方法更直观简单些。
2.进行计算的类型分为字符串和本地文件,
3.在Ubuntu 14.04 64bit上需要链接 -lcrypto,在ContOS上需要链接,不论是保存为c文件还是cpp文件
4.临时缓存一定要使用unsigned char,不能使用char,因为unsigned char 0~255 ,char -127~127。使用char会出问题。这个md5加密函数,返回16个十进制数,范围在0~255间,把它format为十六进制就是32位md5编码了。
5.snprintf时的格式,%02X和%2.2格式是一样的,强制输出两位,比如十进制的8,十六进制也是8,这个格式是控制输出两位,08。如果加密结果要小写字母显示,就是"%2.2x",大写就是"2.2X"。
6.运行得到结果后,我们可以使用md5sum命令进行验证,并对比。
7.注意这里用到openssl库,并且限定在Ubuntu上, 如果在CentOS平台上,可以运行 yum install openssl  和 yum install openssl-devel 进行安装。

参考文献

[1].http://www.cnblogs.com/wunaozai/p/3887009.html

[2].http://www.cppblog.com/API/archive/2013/08/09/202427.html

[3].http://blog.webfuns.net/archives/1477.html

在Ubuntu 14.04 64bit上进行md5加密编程相关推荐

  1. 在Ubuntu 14.04 64bit上安装Markdown和绘图软件Haroopad

    简介 Haroopad:一款让你欲罢不能的Markdown编辑器 身为大程序员,我本来是不需要 Markdown 编辑器的,但是 Haroopad 让我简直欲罢不能,不能再爱更多.跨平台,代码高亮,V ...

  2. 在Ubuntu 14.04 64bit上安装StarUML 2.5版本

    StarUML是来自韩国的一个优秀的UML绘图软件, 原来是免费软件, 现在需要付费购买.当然免费使用功能会有诸多限制. 它支持Windows, Linux和Mac OS等平台. 下面是我在Ubunt ...

  3. 在Ubuntu 14.04 64bit上生成ATS本地离线文档

    下面是在Ubuntu 14.04 64bit上生成ats本地离线文档的方法 首先请安装配置好sphinx环境,参见我前面的博文 http://blog.csdn.net/tao_627/article ...

  4. 在Ubuntu 14.04 64bit上编译并研究State Threads网络线程库源码

    State Threads是一个广受关注的高性能网络线程库,winlin在SRS中做了比较充分的应用,我很遗憾直到现在才精心研究它.下面是我的研究实录,以作备忘. 一.源码编译 下面是在Ubuntu ...

  5. 在Ubuntu 14.04 64bit上安装Markdown编辑器Remarkble

    目前Markdown已经是非常流行和高效的文档整理和书写工具语言, 我以前接触过, 但是一直没有坚持下来, 这次五一假期期间我强迫自己去熟悉它的语法格式和编辑器, 原来我在Ubuntu 14.04 6 ...

  6. 在Ubuntu 14.04 64bit上安装百度云Linux客户端BCloud

    百度云是一个不错的网盘,Bcloud 是一个 Linux 下超赞的客户端, 官网 github: https://github.com/LiuLang/bcloud-packages 和kwplaye ...

  7. 在ubuntu 14.04 64bit上安装酷我音乐盒Linux客户端kwplayer

    kwplayer 是linux桌面下的轻量级的音乐播放软件, 由LiuLang同学开发, 使用的是Python3+gtk3, 开源的(GPLv3). 它的主要特点有: • 使用了kuwo.cn(酷我音 ...

  8. 在Ubuntu 14.04 64bit上安装numpy和matplotlib库

    机器学习是数据挖掘的一种实现形式,在学习<机器学习实战>过程中,需要python环境中安装好numpy和matplotlib库,特此将我在Ubuntu 14.04 64bit上的摸索过程总 ...

  9. Ubuntu 14.04 64bit上升级Intel官方集显更新驱动程序

    Intel官网上发出了最新版的Linux版本的集显驱动更新程序 但是,使用Ubuntu 14.04 64bit上的软件中心无法自动去更新该集显驱动更新程序,说是不安装未被确认安全的程序.下面是我采用的 ...

最新文章

  1. Linux Shell脚本实现根据进程名杀死进程
  2. 高性能WEB开发 - HTTP服务器篇
  3. css3玩转各种效果【资源】
  4. 报告指出数据中心效率有所提高
  5. Model、ModelMap和ModelAndView的使用详解
  6. jquery.validate动态更改校验规则
  7. 去除地址栏带#的问题
  8. 网络协议 18 - CDN:家门口的小卖铺
  9. 十个最常用深度学习图像/视频数据标注工具
  10. 鲁棒控制--simulink不确定模型仿真
  11. 基于java水果网店管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  12. vector实现 并交差 集实例
  13. 使用Python获取100以内的质数
  14. html 脚本错误,脚本错误怎么解决,教您脚本错误怎么解决?
  15. 对于网络文学而言 计算机叙事,90年代文学的“增量”
  16. 苹果电池显示维修_iPhone电池健康显示“维修”的原因和解决办法
  17. APUE-第5章 标准IO库
  18. Js年龄计算,精确到岁、月、小时
  19. Y470N 显卡超频了GT550m 完美2.10 bios
  20. 图文翻页-兼容IE8和Chrome浏览器

热门文章

  1. Java Websocket实例【服务端与客户端实现全双工通讯】
  2. 2022-2028年中国无菌手套产业发展动态及投资趋势预测报告
  3. 谈谈对web标准的理解
  4. 如何 搭建 RMAN 备份平台
  5. 机器人控制算法——Bayes Filter贝叶斯滤波器
  6. rabbitmq 查询版本_基于rabbitmq解决分布式事务
  7. wordpress php教程 pdf,wordpress二次开发全能教程.pdf
  8. linux双物理机weblogic集群,linux下weblogic多机器集群部署要点
  9. python response.json()报错_Django JsonResponse json格式报错 解决Django响应JsonResponse返回json格式数据报错问题...
  10. greenplum 数据库如何增加列_Greenplum行存与列存的选择以及转换方法-阿里云开发者社区...