如何进行MD5验证.docx

上传人:b****8 文档编号:11342604 上传时间:2023-02-28 格式:DOCX 页数:16 大小:22.84KB
下载 相关 举报
如何进行MD5验证.docx_第1页
第1页 / 共16页
如何进行MD5验证.docx_第2页
第2页 / 共16页
如何进行MD5验证.docx_第3页
第3页 / 共16页
如何进行MD5验证.docx_第4页
第4页 / 共16页
如何进行MD5验证.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

如何进行MD5验证.docx

《如何进行MD5验证.docx》由会员分享,可在线阅读,更多相关《如何进行MD5验证.docx(16页珍藏版)》请在冰豆网上搜索。

如何进行MD5验证.docx

如何进行MD5验证

如何进行MD5验证?

  篇一:

MD5验证是什么?

  MD5验证是什么?

  从通俗的话讲---就好比每个人的指纹都是唯一的一样,文件的MD5值也是唯一的,效验MD5就是用来确保文件在传输过程中未被修改用的。

  从专业的话解释----一个MD5校验通过对接收的传输数据执行散列运算来检查数据的正确性。

计算出的散列值拿来和随数据传输的散列值比较。

如果两个值相同,说明传输的数据完整无误、没有被窜改过(前提是散列值没有被窜改),从而可以放心使用。

  MD5校验可以应用在多个领域,比如说机密资料的检验,下载文件的检验,明文密码的加密等

  MD5校验原理举例说明:

  如客户往我们数据中心同步一个文件,该文件使用MD5校验,那么客户在发送文件的同时会再发一个存有校验码的文件,我们拿到该文件后做MD5运算,得到的计算结果与客户发送的校验码相比较,如果一致则认为客户发送的文件没有出错,否则认为文件出错需要重新发送。

  篇二:

发送验证邮件的三种方法

  在.NET中的名字空间下,有一个专门使用SMTP协议来发送邮件的类:

SmtpMail,它已能满足最普通的发送邮件的需求。

这个类只有一个自己的公共函数--Send()和一个公共属性—SmtpServer

  您必须通过SmtpServer属性来指定发送邮件的服务器的名称(或IP地址),然后再调用Send()函数来发送邮件。

  第二、使用CDO组件发送邮件

  CDO是CollaborationDataObjects的简称,它是一组高层的COM对象集合,并经历了好几个版本的演化,现在在Windows2000和Exchange2000中使用的都是的版本(分别为和)。

CDOSYS构建在SMTP协议和NNTP协议之上,并且作为Windows2000Server的组件被安装,您可以在系统目录(如c:

\winnt或c:

\windows)的system32子目录中找到它()。

  CDO组件相对于先前介绍的SmtpMail对象功能更为丰富,并提供了一些SmtpMail类所没有提供的功能,如通过需要认证的SMTP服务器发送邮件等。

  下面一段代码就展示了如何使用CDO组件通过需要认证的SMTP服务器发送邮件的过程:

  (inC#)

  publicvoidCDOsendMail()

  {

  try

  {

  oMsg=new();

  =“myaccount@”;

  =“myaccount@”;

  =“MailTest”;

  =“Test”;

  iConfg=;

  oFields=;

  oFields[“configuration/sendusing”].Value=2;

  oFields[“configuration/sendemailaddress”].Value=“myaccount@”;//sendermail

  oFields[“configuration/smtpaccountname”].Value=“myaccount@”;//emailaccount

  oFields[“configuration/sendusername”].Value=“username”;oFields[“configuration/sendpassword”].Value=“password”;oFields[“configuration/smtpauthenticate”].Value=1;//value=0代表Anonymous验证方式(不需要验证)

  //value=1代表Basic验证方式(使用basic(clear-text)authentication.

  //Theconfigurationsendusername/sendpasswordorpostusername/postpasswordfieldsareusedto

  specifycredentials.)

  //Value=2代表NTLM验证方式(SecurePasswordAuthenticationinMicrosoftOutlookExpress)

  oFields[“configuration/languagecode”].Value=0x0804;

  oFields[“configuration/smtpserver”].Value=““;

  ();

  =“gb2312”;

  =“gb2312”;

  ();

  oMsg=null;

  }

  catch(Exceptione)

  {

  throwe;

  }

  }

  注意:

由于Exchange2000的CDO组件会更新原有的Windows2000的CDO组件,所以如果您希望继续使用,您必须先通过卸载掉。

  第三、使用Socket撰写邮件发送程序

  当然,如果您觉得SmtpMail不能满足您的需求,CDO又不够直截了当,那就只能自己动手了;其实如果您很熟悉Socket编程,自己写一个发送邮件的程序并不很难,以下就是一个例子。

  首先,我们简单介绍一下带验证的SMTP服务器如何使用AUTH原语进行身份验证,其详细的定义可以参考RFC2554。

  具体如下:

  1)首先,需要使用EHLO而不是原先的HELO。

  2)EHLO成功以后,客户端需要发送AUTH原语,与服务器就认证时用户名和密码的传递方式进行协商。

  3)如果协商成功,服务器会返回以3开头的结果码,这是就可以把用户名和密码传给服务器。

  4)最后,如果验证成功,就可以开始发信了。

  下面是一个实际的例子,客户端在WinXP的Command窗口中通过”telnet25”命令连接到263的smtp服务器发信:

  220WelcometocoremailSystem(WithAnti-Spam)

  EHLO

  250-PIPELINING

  250-SIZE10240000

  250-ETRN

  250-AUTHLOGIN

  2508BITMIME

  AUTHLOGIN

  334VXNlcm5hbWU6

  bXlhY2NvdW50

  334UGFzc3dvcmQ6

  bXlwYXNzd29yZA==

  235Authenticationsuccessful

  MAILFROM:

myaccount@

  250Ok

  RCPTTO:

myaccount@

  250Ok

  Data

  354Enddatawith.

  Thisisatestingemail.

  haha.

  .

  250Ok:

queuedasAC5291D6406C4

  QUIT

  221Bye

  上面的内容就是发信的全过程。

其中与身份验证有关的主要是第九到第十四行:

AUTHLOGIN“客户端输入

  334VXNlcm5hbWU6“服务器提示“Username:

=“

  bXlhY2NvdW50“客户端输入“myaccount=“的Base64编码

  334UGFzc3dvcmQ6“服务器提示“Password:

=“

  bXlwYXNzd29yZA==“客户端输入“mypassword=“的Base64编码

  235Authenticationsuccessful“服务器端通过验证

  从上面的分析可以看出,在这个身份验证过程中,服务器和客户端都直接通过Socket传递经过标准Base64编码的纯文本。

这个过程可以非常方便的用C#实现,或者直接添加到原有的源代码中。

  另外,有些ESMTP服务器不支持AUTHLOGIN方式的认证,只支持AUTHCRAM-MD5方式验证。

但是这两者之间的区别只是文本的编码方式不同。

  实现此功能的源代码可以在opensmtp-net/上找到下载。

下面给出了一个简单的伪码:

  publicvoidSendMail(MailMessagemsg)

  {

  NetworkStreamnwstream=GetConnection();

  WriteToStream(refnwstream,“EHLO“+smtpHost+“\r\n”);

  stringwelcomeMsg=ReadFromStream(refnwstream);

  //implementHELOcommandifEHLOisuecognized.

  if(IsUnknownCommand(welcomeMsg))

  {

  WriteToStream(refnwstream,“HELO“+smtpHost+“\r\n”);

  }

  CheckForError(welcomeMsg,);

  //Authenticationisusediftheu/paresupplied

  AuthLogin(refnwstream);

  WriteToStream(refnwstream,“MAILFROM:

\r\n”);CheckForError(ReadFromStream(refnwstream),);

  SendRecipientList(refnwstream,);

  SendRecipientList(refnwstream,);

  SendRecipientList(refnwstream,);

  WriteToStream(refnwstream,“DATA\r\n”);

  CheckForError(ReadFromStream(refnwstream),_INPUT);

  if(!

=null&&!

=0)

  {WriteToStream(refnwstream,“Reply-To:

\”“++“\”\r\n”);}

  else

  {WriteToStream(refnwstream,“Reply-To:

\r\n”);}

  if(!

=null&&!

=0)

  {WriteToStream(refnwstream,“From:

\”“++“\”\r\n”);}

  else

  {WriteToStream(refnwstream,“From:

\r\n”);}

  WriteToStre

  篇三:

单片机常用校验方法

  常见校验算法

  一、校验算法

  奇偶校验(单字节奇偶校验和多字节奇偶校验)

  MD5校验

  求校验和

  BCC(BlockCheckCharacter/信息组校验码),常说的异或校验方法

  CRC(CyclicRedundancyCheck/循环冗余校验)

  LRC(LongitudinalRedundancyCheck/纵向冗余校验)

  二、奇偶校验

  内存中最小的单位是比特,也称为“位”,位有只有两种状态分别以1和0来标示,每8个连续的比特叫做一个字节(byte)。

不带奇偶校验的内存每个字节只有8位,如果其某一位存储了错误的值,就会导致其存储的相应数据发生变化,进而导致应用程序发生错误。

而奇偶校验就是在每一字节(8位)之外又增加了一位作为错误检测位。

在某字节中存储数据之后,在其8个位上存储的数据是固定的,因为位只能有两种状态1或0,假设存储的数据用位标示为1、1、1、0、0、1、0、1,那么把每个位相加(1+1+1+0+0+1+0+1=

  5),结果是奇数,那么在校验位定义为1,反之为0。

当CPU读取存储的数据时,它会再次把前8位中存储的数据相加,计算结果是否与校验位相一致。

从而一定程度上能检测出内存错误,奇偶校验只能检测出错误而无法对其进行修正,同时虽然双位同时发生错误的概率相当低,但奇偶校验却无法检测出双位错误

  三、MD5校验

  MD5的全称是Message-DigestAlgorithm5,在90年代初由MIT的计算机科学实验室和RSADataSecurityInc发明,由MD2/MD3/MD4发展而来的。

MD5的实际应用是对一段Message(字节串)产生fingerprint(指纹),可以防止被“篡改”。

举个例子,天天安全网提供下载的MD5校验值软件,其MD5值是1e07ab3591d25583eff5129293dc98d2,但你下载该软件后计算MD5发现其值却是81395f50b94bb4891a4ce4ffb6ccf64b,那说明该ZIP已经被他人修改过,那还用不用该软件那你可自己琢磨着看啦。

  四、求校验和

  求校验和其实是一种或运算。

如下:

  //--------------------------------------------------------------------------------------------------//如下是计算校验位函数

  //checkdata,包括起始位在内的前九位数据的校验和

  //--------------------------------------------------------------------------------------------------unsignedcharCLU_checkdata(void)

  {//求校验和

  unsignedcharcheckdata=0;

  for(point=0;point<9,TI=1;point++)

  {

  checkdata=checkdata|buffer[point];

  }

  return(checkdata);

  }

  四、BCC(BlockCheckCharacter/信息组校验符号)

  BCC校验其实是奇偶校验的一种,但也是经常使用并且效率较高的一种,所谓BCC校验法(blockcheckcharacter),就是在发送前和发送后分别把BCC以前包括ETX字符的所有字符按位异或后,按要求变换(增加或前去一个固定的值)后所得到的字符进行比较,相等即认为通信无错误,不相等则认为通信出错.

  非接触卡读卡器与PC机的通讯格式如下:

  STX(02H)+6个字节的卡号+VERH+VERL+EOT(04H)

  STX(02H)起始字节

  EOT(04H)结束字节

  6个字节的卡号为六个十六进制的ASCII字符,6个字节的传送,高字节在前,低字节在后。

例如:

  卡号:

8DEF9E

  传输的数据格式:

384445463945(十六进制)

  在校验时采用目前最通用的BCC校验方式:

  具体的方法是:

  将有效的卡号接字节作异或(XOR)校验:

  38H(XOR)44H(XOR)45H(XOR)46H(XOR)39H(XOR)45H=03H然后将接收到的数据VERH+VERL合成一个字节数据,30H(HEX)=0,33H(HEX)=3

  合成数据为03H,接收到的数据与我们收到的卡号的校验数据一致,则接收到的卡号为正确卡号。

  再比如现有卡号为:

  卡号:

058E42

  传输的数据格式:

303538453432(十六进制)

  在校验时采用目前最通用的BCC校验方式:

  具体的方法是:

  将有效的卡号接字节作异或(XOR)校验:

  30H(XOR)35H(XOR)38H(XOR)45H(XOR)34H(XOR)32H=7EH然后将接收到的数据VERH+VERL合成一个字节数据,37H(HEX)=7,45H(HEX)=E

  合成数据为7EH,接收到的数据与我们收到的卡号的校验数据一致,则接收到的卡号为正确卡号。

  在编写程序时,可以先将所有数据都接收到计算机的内存中,然后计算BCC校验值VALUE1,再将接收的BCC值

  拼成一个十六进制数VALUE2,然后比较这两个值,如果相等,则接收到的卡号为合法卡号,然后按您的系统

  作相应的处理。

  VB代码如下:

  PublicFunctionbcc(aAsString)AsString

  DimbAsInteger

  b=0

  Fori=1ToLen(a)Step2

  b=bXor(“&h”+Mid(a,i,2))

  Next

  b=bAnd&HFF

  Ifb<16Then

  bcc=“0”+Hex(b)

  Else

  bcc=Hex(b)

  EndIf

  EndFunction

  五、CRC(CyclicRedundancyCheck/循环冗余校验)

  CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。

在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。

  16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以)后,再除以一个多项式,最后所得到的余数既是CRC码.

  它是利用除法及余数的原理来作错误侦测(ErrorDetecting)的。

实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。

  根据应用环境与习惯的不同,CRC又可分为以下几种标准:

  ①CRC-12码;

  ②CRC-16码;

  ③CRC-CCITT码;

  ④CRC-32码。

  CRC-12码通常用来传送6-bit字符串。

  CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。

  CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。

  下面为CRC计算过程:

  1.设置CRC寄存器,并给其赋值FFFF(hex)。

  2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。

  3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。

  4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。

  5.重复第3与第4步直到8次移位全部完成。

此时一个8-bit数据处理完毕。

  6.重复第2至第5步直到所有数据全部处理完成。

  7.最终CRC寄存器的内容即为CRC值。

  常用的CRC循环冗余校验标准多项式如下:

  CRC(16位)=X16+X15+X2+1

  CRC(CCITT)=X16+X12+X5+1

  CRC(32位)=X32+X26+X23+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1

  以CRC(16位)多项式为例,其对应校验二进制位列为11000000000000101。

CRC基本原理是:

在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。

对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x),根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。

  校验码的具体生成过程为:

假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2R,这样C(x)的右边就会空出R位,这就是校验码的位置。

通过C(x)*2R除以生成多项式G(x)得到的余数就是校验码。

  几个基本概念

  1、多项式与二进制数码

  多项式和二进制数有直接对应关系:

x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。

可以看出:

x的最高幂次为R,转换成对应的二进制数有R+1位。

  多项式包括生成多项式G(x)和信息多项式C(x)。

  如生成多项式为G(x)=x4+x3+x+1,可转换为二进制数码11011。

  而发送信息位1111,可转换为数据多项式为C(x)=x3+x2+x+1。

  2、生成多项式

  是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。

  在发送方,利用生成多项式对信息多项式做模2除生成校验码。

在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。

  应满足以下条件:

  a、生成多项式的最高位和最低位必须为1。

  b、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做模2除后应该使余数不为0。

  c、不同位发生错误时,应该使余数不同。

  d、对余数继续做模2除,应使余数循环。

  将这些要求反映为数学关系是比较复杂的。

但可以从有关资料查到常用的对应于不同码制的生成多项式如图9所示:

  NK码距dG(x)多项式G(x)

  743x3+x+11011

  743x3+x2+11101

  734x4+x3+x2+111101

  734x4+x2+x+110111

  15113x4+x+110011

  1575x8+x7+x6+x4+1111010001

  31263x5+x2+1100101

  31215x10+x9+x8+x6+x5+x3+111101101001

  63573x6+x+11000011

  63515x12+x10+x5+x4+x2+11010000110101

  10411024x16+x15+x2+111000000000000101

  3、模2除(按位除)

  模2除做法与算术除法类似,但每一位除(减)的结果不影响其它位,即不向上一位借位。

所以实际上就是异或。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1