文章目录

  • 一. 什么是MD5
  • 二. Linux下的简单实现
  • 三. 测试

最近看到PPP拨号在验证时,有两种验证方式,一种是口令验证协商(PAP),另一种是挑战-握手验证协议(CHAP),因为最近在做的一个项目,其中也用到了客户端登录验证连接服务器的这样一个方式,所以也想对客户端发送的用户名与密码信息进行加密后传输,避免明文的直接传递。后来了解到了MD5加密,虽然不是很懂其内部算法原理,但是用起来还是很好用的.

一. 什么是MD5

MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。
密码散列函数(Cryptographic hash function),又译为加密散列函数,是散列函数的一种。
MD4算法在安全上有大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用,比如MD5加密算法.

功能

输入任意长度的信息,经过处理,输出都是128位的信息值不同的输入对应的输出一定不同,保证唯一性

争议

MD5属不属于加密算法,因为只可以加密,无法获得密码原文,只能属于算法。
另一种观点,正因为看不到原文,使得原文得到加密处理。
个人观点:对于公司的用户,采用MD5是可以放心的,第一,对于黑色截获MD5后很难破解。第二,对于商家内部,只能获得用户加密后的密文,无法看到用户的真实密码,这也是对用户信息的一定保护。

MD5的优势

防止被篡改,在传输过程中一旦被串改,那么计算出的MD5值一定不同。
计算速度快。加密速度快,不需要秘钥。
检查文件的完整性,一旦文件被更改,MD5值也是不同的。
防止看到明文,公司存放密码存放的是MD5值。
防止抵赖,用于数字签名,一旦用户的文件被第三方MD5加密,若以后A说这个文件不是他写的,那么当用文件MD5后获得的签名一致,可以确认。

二. Linux下的简单实现

MD5加密系列的函数位于Linux下 /usr/include/openssl 这个文件夹下


使用起来很简单,主要用到三个函数

  1. void MD5_Init(MD5_CTX *ctx);
    参数需要传一个MD5_CTX类型结构的地址,Md5Ctx将在后面的函数中用到.
    其结构如下:
typedef struct {MD5_u32plus lo, hi;MD5_u32plus a, b, c, d;unsigned char buffer[64];  //未加密的明文MD5_u32plus block[16];   //加密后的128位密文
} MD5_CTX;
  1. void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size);
    这个函数用来加密我们传进来的字符串,并保存到结构体成员中;

  2. void MD5_Final(unsigned char *result, MD5_CTX *ctx);
    获取已加密的密文

把三个函数封装

/*********************************************************************************** Function:   void md5_encryption(const char *unencrypted_buf,int unencrypted_buf_len,char *encrypted_buf,int encrypted_buf_size)*    *   Parameter:   const char *unencrypted_buf     -     Encrypted data  *    *                int unencrypted_buf_len         -     The length of unencrypted_buf *    *                char *encrypted_buf             -     Used to store encrypted ciphertext*    *                int encrypted_buf_size          -     The length of encrypted_buf*    * Description:   Use the incoming plaintext to encrypt and save to encrypted_buf*    *      Return:   void**********************************************************************************/void md5_encryption(const char *unencrypted_buf,int unencrypted_buf_len,char *encrypted_buf,int encrypted_buf_size)
{MD5_CTX               Md5Ctx;MD5_Init(&Md5Ctx);  //初始化MD5_Update(&Md5Ctx, (unsigned char *)encrypted_buf, unencrypted_buf_len); //md5加密MD5_Final(encrypted_buf, &Md5Ctx);}

三. 测试

下面是我自己写的一个链表,主要是服务器用来保存客户信息的,在项目中,其原理是:
服务器在收到客户端登录验证的密文后,对链表进行遍历,并对链表中已有的用户名与密码进行相同MD5加密后与客户端传来的密文进行比较,从而实现登录验证。

链表中找到:

修改以后:

Linux MD5加密的简单使用相关推荐

  1. linux md5 加密字符串和文件方法

    linux md5 加密字符串和文件方法 MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意 ...

  2. 【JavaScript MD5加密】——简单的MD5加密脚本

    /*md5加密转换脚本 */var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ var b64pad = &q ...

  3. md5加密原理简单解释

    转载自:https://www.cnblogs.com/second-tomorrow/p/9129043.html 本文将通过漫画的形式来通俗易懂的讲述什么是MD5加密算法(Message Dige ...

  4. linux md5加密文件,Linux下对字符串进行MD5加密

    深入学习golang(1)-数组与切片 数据(array)与切片(slice) 数组声明: ArrayType   = "[" ArrayLength "]" ...

  5. ios android md5加密,iOS中使用MD5加密

    在iOS中使用MD5加密较简单,需要引入头文件CommonCrypto/CommonDigest.h,我们单独新建一个用于MD5加密的类Encryption,此类继承NSObject. Encrypt ...

  6. android php md5加密解密,Android中的md5加密怎么与php md5加密保持一致

    Android中的md5加密怎么与php md5加密保持一致 发布时间:2020-12-05 15:27:37 来源:亿速云 阅读:72 作者:Leah 这期内容当中小编将会给大家带来有关Androi ...

  7. linux下md5加密(使用openssl库C实现)

    from: http://blog.csdn.net/shahongzhou/article/details/6307972 本文介绍linux c使用openssl/md5.h加密,有两种实现方法. ...

  8. Java实现Linux的md5加密,Linux_详细讲解:Linux系统GRUB的MD5加密方法,1、用grub-md5-crypt成生GRUB的md5密 - phpStudy...

    详细讲解:Linux系统GRUB的MD5加密方法 1.用grub-md5-crypt成生GRUB的md5密码: 通过grub-md5-crypt对GRUB的密码进行加密码运算,比如我们想设置grub的 ...

  9. android apk md5加密工具,Android实现简单MD5加密的方法

    本文实例讲述了Android实现简单MD5加密的方法.分享给大家供大家参考,具体如下: 网上关于android下MD5加密的资料很多,但是测试了下总是跟网站的md5加密不一样, 后来才知道是编码方式不 ...

最新文章

  1. Udacity机器人软件工程师课程笔记(二十一) - 对点云进行集群可视化 - 聚类的分割 - K-means|K均值聚类, DBSCAN算法
  2. hive创建mysql表,hiveMysql创建、修改、删除字段/表
  3. js及jQuery实现checkbox的全选、反选和全不选
  4. oracle rac scan ip 用途 原理
  5. SPI初始化C语言编程,SD卡spi模式读写,初始化和复位都成功了
  6. 【机器学习】UMAP:强大的可视化降维工具
  7. 【深度学习】从R-CNN到Mask R-CNN的思维跃迁
  8. Oracle delete input与delete all input
  9. 计算机主机特点,计算机的五大特点是什么
  10. 利用正则表达式 替换字符串中多个 URL
  11. 《Entity Framework 6 Recipes》中文翻译系列 (15) -----第三章 查询之与列表值比较和过滤关联实体...
  12. AutoCAD ObjectArx2010安装
  13. 串口通信 数据采集软件 上位机 数据采集软件,可以采集plc,串口通信设备,tcp通信设备的数据
  14. (五十二):多模态情感分析研究综述_张亚洲
  15. div显示在上层_如何让div总是显示在最上层,而不致于被其他div遮挡
  16. ps切图的零散小知识
  17. 电脑摄像头识别二维码OpenCV程序
  18. linux ps输出项的含义,【整理】ps命令输出字段的含义
  19. 《Windows核心编程》读书笔记二十五章 未处理异常,向量化异常处理与C++异常
  20. 计算机基础题word,计算机应用基础试题(带答案)Word版

热门文章

  1. HTML 页面中的位置:clientX、screenX、offsetX、pageX
  2. Java及spring 注解(反射原理)
  3. DataGridView单元格中播放gif动画的变通方法(转自:博客园蜡人张)
  4. 【NLP】实体识别TENER论文阅读笔记
  5. mysql sort by_mysql的sort by学习
  6. 2019年个人生活总结
  7. jmeter socket close 原因
  8. Orace WDP 授权培训查询
  9. STL之sstream的用法
  10. Windows 官方原版镜像链接地址