MD5应用的一点理解及Linux实现源码
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),相关的标准是RFC1321,MD5的算法描述可以查看这份RFC或者自己google,这里就不提这些概念性的问题了. 需要说明的是MD5加密是单向不可逆的,也就是说没有办法把已经加密的密文还原为明文.最常见的应用在于用户名密码在数据库中的保存,一般的做法是将密码用MD5加密后将密文存入数据库,用户登陆时再将用户输入的明文密码做MD5运算后与数据库进行密文比照,密文比照不符则证明密码输入错误了.如果密码丢失了就只能重置,没有人会知道数据库中保存的密文所对应的明文.网上有看到说破解,这个不想做过多研究,仅凭一点经验理解,基本知道只要明文设置的复杂一些,解密几乎是不可能的事情. 最近在做UDP传输过程中的MD5校验,即是将所传输的数据(大约10KB的字串)进行MD5运算,然后把10KB的数据和32位长的MD5值一并发向客户端,客户端收到后再对所收到的10KB字串做MD5运算,与传输过来的MD5值比对,就可知道收到的数据是否有误需要丢弃或通知重传了.或许传输过来的MD5也会有误,不知道这样的问题IETF是怎么考虑的,知道的麻烦告知. 以下是自己整理的一份对字符串MD5加密的源码,留备记录.
#ifndef MD5_H
#define MD5_H
#ifdef __alpha
typedef unsigned int uint32;
#else
typedef unsigned long uint32;
#endif
struct MD5Context {
uint32 buf[4];
uint32 bits[2];
unsigned char in[64];
};
void MD5Init(struct MD5Context *context);
void MD5Update(struct MD5Context *context, unsigned char const *buf,
unsigned len);
void MD5Final(unsigned char digest[16], struct MD5Context *context);
void MD5Transform(uint32 buf[4], uint32 const in[16]);
/*
* This is needed to make RSAREF happy on some MS-DOS compilers.
*/
typedef struct MD5Context MD5_CTX;
#endif /* !MD5_H */
md5.c
/*
* This code implements the MD5 message-digest algorithm.
* The algorithm is due to Ron Rivest. This code was
* written by Colin Plumb in 1993, no copyright is claimed.
* This code is in the public domain; do with it what you wish.
*
* Equivalent code is available from RSA Data Security, Inc.
* This code has been tested against that, and is equivalent,
* except that you don''t need to include two pages of legalese
* with every copy.
*
* To compute the message digest of a chunk of bytes, declare an
* MD5Context structure, pass it to MD5Init, call MD5Update as
* needed on buffers full of bytes, and then call MD5Final, which
* will fill a supplied 16-byte array with the digest.
*/
#include |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |