admin管理员组

文章数量:1639683

文章目录

  • 一. 什么是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