2023年12月7日发(作者:)
如何进行MD5验证?
篇一:MD5验证是什么?
MD5验证是什么?
从通俗的话讲---就好比每个人的指纹都是唯一的一样,文件的MD5值也是唯一的,效验MD5就是用来确保文件在传输过程中未被修改用的.
从专业的话解释----一个 MD5 校验通过对接收的传输数据执行散列运算来检查数据的正确性.计算出的散列值拿来和随数据传输的散列值比较.如果两个值相同,说明传输的数据完整无误.没有被窜改过(前提是散列值没有被窜改),从而可以放心使用.
MD5校验可以应用在多个领域,比如说机密资料的检验,下载文件的检验,明文密码的加密等
MD5校验原理举例说明:
如客户往我们数据中心同步一个文件,该文件使用MD5校验,那么客户在发送文件的同时会再发一个存有校验码的文件,我们拿到该文件后做MD5运算,得到的计算结果与客户发送的校验码相比较,如果一致则认为客户发送的文件没有出错,否则认为文件出错需要重新发送.
篇二:发送验证邮件的三种方法
在.NET中的名字空间下,有一个专门使用SMTP协议来发送邮件的类:SmtpMail,它已能满足最普通的发送邮件的需求.这个类只有一个自己的公共函数--Send()和一个公共属性—SmtpServer
您必须通过SmtpServer属性来指定发送邮件的服务器的名称(或IP地址),然后再调用 Send()函数来发送邮件.
第二.使用CDO组件发送邮件
CDO是Collaboration Data Objects的简称,它是一组高层的COM对象集合,并经历了好几个版本的演化,现在在Windows_和E_change_中使用的都是CDO2.0的版本(分别为和cdoe_.dll).CDOSYS构建在SMTP协议和NNTP协议之上,并且作为Windows_ Server的组件被安装,您可以在系统目录(如c:winnt或c:windows)的system32子目录中找到它().
CDO组件相对于先前介绍的SmtpMail对象功能更为丰富,并提供了一些SmtpMail类所没有提供的功能,如通过需要认证的SMTP服务器发送邮件等.
下面一段代码就展示了如何使用CDO组件通过需要认证的SMTP服务器发送邮件的过程:
(in C_)
public void CDOsendMail()
{
try
{
e oMsg = new e();
= myaccount@
= myaccount@
t = MailTest
dy = html body Test /body /html
guration iConfg = uration;
oFields = ;
oFields[ /cdo/configuration/sendusing ].Value=2;
oFields[ /cdo/configuration/sendemailaddress ].Value= myaccount@ //sender mail
oFields[ /cdo/configuration/smtpaccountname ].Value= myaccount@ //email account
oFields[ /cdo/configuration/sendusername
].Value= username
oFields[ /cdo/configuration/sendpassword
].Value= password oFields[ /cdo/configuration/smtpauthenticate ].Value=1; //value=0 代表Anonymous验证方式(不需要验证)
//value=1 代表Basic验证方式(使用basic (clear-te_t) authentication.
//The configuration sendusername/sendpassword or
postusername/postpassword fields are used to
specify credentials.)
//Value=2 代表NTLM验证方式(Secure Password Authentication in
Microsoft Outlook E_press)
oFields[ /cdo/configuration/languagecode
].Value=0___;
oFields[ /cdo/configuration/smtpserver ].Value= smtp._
();
t= gb23_
t= gb23_
();
oMsg = null;
}
catch (E_ception e)
{
throw e;
}
}
注意:由于E_change_的CDO组件cdoe_.dll会更新原有的Windows_的CDO组件,所以如果您希望继续使用,您必须先通过regsrv32.e_e卸载掉cdoe_.dll.
第三.使用Socket撰写邮件发送程序 当然,如果您觉得SmtpMail不能满足您的需求,CDO又不够直截了当,那就只能自己动手了;其实如果您很熟悉Socket编程,自己写一个发送邮件的程序并不很难,以下就是一个例子.
首先,我们简单介绍一下带验证的SMTP服务器如何使用AUTH原语进行身份验证,其详细的定义可以参考RFC2554.
具体如下:
1)首先,需要使用EHLO而不是原先的HELO.
2)EHLO成功以后,客户端需要发送AUTH原语,与服务器就认证时用户名和密码的传递方式进行协商.
3)如果协商成功,服务器会返回以3开头的结果码,这是就可以把用户名和密码传给服务器.
4)最后,如果验证成功,就可以开始发信了.
下面是一个实际的例子,客户端在Win_P的Command窗口中通过 telnet
25 命令连接到263的smtp服务器发信:
2_ Welcome to coremail System(With Anti-Spam) 2.1
EHLO
250-_2._8.30.29
250-PIPELINING
250-SIZE 1_4__
250-ETRN
250-AUTH LOGIN
250 8BITMIME
AUTH LOGIN
334 V_Nlcm5hbWU6
b_lhY2NvdW50
334 UGFzc3dvcmQ6
b_lwY_Nzd29yZA==
235 Authentication successful
MAIL FROM:myaccount@ 250 Ok
RCPT TO:myaccount@
250 Ok
Data
354 End data with CR LF . CR LF
This is a testing email.
haha.
.
250 Ok: queued as AC5291D64_C4
QUIT
2_ Bye
上面的内容就是发信的全过程.其中与身份验证有关的主要是第九到第十四行: AUTH LOGIN 客户端输入
334 V_Nlcm5hbWU6 服务器提示〝Username:=
b_lhY2NvdW50 客户端输入〝myaccount= 的Base64编码
334 UGFzc3dvcmQ6 服务器提示〝Password:=
b_lwY_Nzd29yZA== 客户端输入〝mypassword= 的Base64编码
235 Authentication successful 服务器端通过验证
从上面的分析可以看出,在这个身份验证过程中,服务器和客户端都直接通过Socket传递经过标准Base64编码的纯文本.这个过程可以非常方便的用C_实现,或者直接添加到原有的源代码中.
另外,有些ESMTP服务器不支持AUTH LOGIN方式的认证,只支持AUTH
CRAM-MD5方式验证.但是这两者之间的区别只是文本的编码方式不同.
实现此功能的源代码可以在
/projects/opensmtp-net/ 上找到下载.下面给出了一个简单的伪码:
public void SendMail(MailMessage msg)
{
NetworkStream nwstream = GetConnection(); WriteToStream(ref nwstream, EHLO + smtpHost + rn
string welcomeMsg = ReadFromStream(ref nwstream);
// implement HELO command if EHLO is uecognized.
if (IsUnknownCommand(welcomeMsg))
{
WriteToStream(ref nwstream, HELO + smtpHost + rn
}
CheckForError(welcomeMsg, );
// Authentication is used if the u/p are supplied
AuthLogin(ref nwstream);
WriteToStream(ref nwstream, MAIL FROM: + s + rn
CheckForError(ReadFromStream(ref nwstream), );
SendRecipientList(ref nwstream, );
SendRecipientList(ref nwstream, );
SendRecipientList(ref nwstream, );
WriteToStream(ref nwstream, DATArn
CheckForError(ReadFromStream(ref
_INPUT);
if ( != null != 0)
{ WriteToStream(ref nwstream, Reply-To: + + +
s + rn }
else
{ WriteToStream(ref nwstream, Reply-To: + s + rn }
if ( != null != 0)
{ WriteToStream(ref nwstream, From: + + +
s + rn }
else
{ WriteToStream(ref nwstream, From: + s + rn }
WriteToStre
nwstream), 篇三:单片机常用校验方法
常见校验算法
一.校验算法
奇偶校验(单字节奇偶校验和多字节奇偶校验)
MD5校验
求校验和
BCC(Block Check Character/信息组校验码),常说的异或校验方法
CRC(Cyclic Redundancy Check/循环冗余校验)
LRC(Longitudinal Redundancy Check/纵向冗余校验)
二.奇偶校验
内存中最小的单位是比特,也称为〝位〞,位有只有两种状态分别以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-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc 发明,由 MD2/MD3/MD4 发展而来的.MD5的实际应用是对一段Message(字节串)产生fingerprint(指纹),可以防止被〝篡改〞.举个例子,天天安全网提供下载的MD5校验值软件,其MD5值是1e_ab3591d25583eff5_9293dc98d2,但你下载该软件后计算MD5 发现其值却是8_95f50b94bb4891a4ce4ffb6ccf64b,那说明该ZIP已经被他人修改过,那还用不用该软件那你可自己琢磨着看啦. 四.求校验和
求校验和其实是一种或运算.如下:
//-------------------------------------------------------------------------------------------------- //如下是计算校验位函数
// checkdata,包括起始位在内的前九位数据的校验和
//-------------------------------------------------------------------------------------------------- unsigned char CLU_checkdata(void)
{ //求校验和
unsigned char checkdata=0;
for(point=0;point 9,TI=1;point++)
{
checkdata=checkdata | buffer[point];
}
return(checkdata);
}
四.BCC(Block Check Character/信息组校验符号)
BCC校验其实是奇偶校验的一种,但也是经常使用并且效率较高的一种,所谓BCC校验法(block check character),就是在发送前和发送后分别把BCC以前包括ET_字符的所有字符按位异或后,按要求变换(增加或前去一个固定的值)后所得到的字符进行比较,相等即认为通信无错误,不相等则认为通信出错.
非接触卡读卡器与PC机的通讯格式如下:
ST_(_H)+ 6个字节的卡号+VERH+VERL+EOT(_H)
ST_(_H)起始字节
EOT(_H)结束字节
6个字节的卡号为六个十六进制的ASCII字符,6个字节的传送,高字节在前,低字节在后.例如:
卡 号:8 D E F 9 E 传输的数据格式:38 44 45 46 39 45(十六进制)
在校验时采用目前最通用的BCC校验方式:
具体的方法是:
将有效的卡号接字节作异或(_OR)校验:
38H (_OR)44H (_OR)45H (_OR)46H (_OR)39H(_OR)45H =_H 然后将接收到的数据VERH+VERL合成一个字节数据,30H(HE_)=0,33H(HE_)=3
合成数据为_H,接收到的数据与我们收到的卡号的校验数据一致,则接收到
的卡号为正确卡号.
再比如现有卡号为:
卡 号:0 5 8 E 4 2
传输的数据格式:30 35 38 45 34 32 (十六进制)
在校验时采用目前最通用的BCC校验方式:
具体的方法是:
将有效的卡号接字节作异或(_OR)校验:
30H (_OR)35H (_OR)38H (_OR)45H (_OR)34H(_OR)32H =7EH 然后将接收到的数据VERH+VERL合成一个字节数据,37H(HE_)=7,45H(HE_)=E
合成数据为7EH,接收到的数据与我们收到的卡号的校验数据一致,则接收到
的卡号为正确卡号.
在编写程序时,可以先将所有数据都接收到计算机的内存中,然后计算BCC校验值VALUE1,再将接收的BCC值
拼成一个十六进制数VALUE2,然后比较这两个值,如果相等,则接收到的卡号为合法卡号,然后按您的系统
作相应的处理.
VB代码如下:
Public Function bcc(a As String) As String
Dim b As Integer
b = 0
For i = 1 To Len(a) Step 2
b = b _or ( h + Mid(a, i, 2)) Ne_t
b = b And HFF
If b _ Then
bcc = 0 + He_(b)
Else
bcc = He_(b)
End If
End Function
五.CRC(Cyclic Redundancy Check/循环冗余校验)
CRC 校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去.在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错.
_位的CRC码产生的规则是先将要发送的二进制序列数左移_位(既乘以 )后,再除以一个多项式,最后所得到的余数既是CRC码.
它是利用除法及余数的原理来作错误侦测(Error Detecting)的.实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误.
根据应用环境与习惯的不同,CRC又可分为以下几种标准:
①CRC-_码;
②CRC-_码;
③CRC-CCITT码;
④CRC-32码.
CRC-_码通常用来传送6-bit字符串.
CRC-_及CRC-CCITT码则用是来传送8-bit字符,其中CRC-_为美国采用,而CRC-CCITT为欧洲国家所采用.
CRC-32码大都被采用在一种称为Point-to-Point的同步传输中.
下面为CRC计算过程: 1.设置CRC寄存器,并给其赋值FFFF(he_).
2.将数据的第一个8-bit字符与_位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(_位) = __+__+_2+1
CRC(CCITT) = __+__ +_5+1
CRC(32位) = _32+_26+_23+__+__+__+__+_8+_7+_5+_4+_2+_+1
以CRC(_位)多项式为例,其对应校验二进制位列为1 1_0 __ __ __. CRC基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码.对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(_),根据G(_)可以生成K位信息的校验码,而G(_)叫做这个CRC码的生成多项式.
校验码的具体生成过程为:假设发送信息用信息多项式C(_)表示,将C(_)左移R位,则可表示成C(_)_2R,这样C(_)的右边就会空出R位,这就是校验码的位置.通过C(_)_2R除以生成多项式G(_)得到的余数就是校验码.
几个基本概念
1.多项式与二进制数码
多项式和二进制数有直接对应关系:_的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0.可以看出:_的最高幂次为R,转换成对应的二进制数有R+1位.
多项式包括生成多项式G(_)和信息多项式C(_).
如生成多项式为G(_)=_4+_3+_+1, 可转换为二进制数码__1.
而发送信息位 __,可转换为数据多项式为C(_)=_3+_2+_+1.
2.生成多项式 是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变.
在发送方,利用生成多项式对信息多项式做模2除生成校验码.在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置.
应满足以下条件:
a.生成多项式的最高位和最低位必须为1.
b.当被传送信息(CRC码)任何一位发生错误时,被生成多项式做模2除后应该使余数不为0.
c.不同位发生错误时,应该使余数不同.
d.对余数继续做模2除,应使余数循环.
将这些要求反映为数学关系是比较复杂的.但可以从有关资料查到常用的对应于不同码制的生成多项式如图9所示:
N K 码距d G(_)多项式 G(_)
7 4 3 _3+_+1 1_1
7 4 3 _3+_2+1 __
7 3 4 _4+_3+_2+1 _1_
7 3 4 _4+_2+_+1 1__
_ _ 3 _4+_+1 1__
_ 7 5 _8+_7+_6+_4+_____
3_6 3 _5+_2+__1_
3_1 5 __+_9+_8+_6+_5+_3+1 _1_1__1
6357 3 _6+_+1 1___
6351 5 __+__+_5+_4+_2+1 1______
1_1 1_4 __+__+_2+1 _______1_
3.模2除(按位除)
模2除做法与算术除法类似,但每一位除(减)的结果不影响其它位,即不向上一位借位.所以实际上就是异或.然后再移位移位做下一位的模2减.步骤如下:
a.用除数对被除数最高几位做模2减,没有借位. b.除数右移一位,若余数最高位为1,商为1,并对余数做模2减.若余数最高位为0,商为0,除数继续右移一位.
c.一直做到余数的位数小于除数时,该余数就是最终余数.
CRC校验程序编写:
编写CRC校验程序有两种办法:一种为计算法,一种为查表法.下面对两种方法分别讨论.
①计算法
计算法就是依据CRC校验码的产生原理来设计程序.其优点是模块代码少,修改灵活,可移植性好.其缺点为计算量大.为了便于理解,这里假定了三位数据,而多项式码为A_1(he_).
在窗体上放置一命令按钮Command1,并添加如下代码:
Private Sub Command1_Click()
Dim CRC() As Byte
Dim d() As Byte 待传输数据
ReDim d(2) As Byte
d(0) = _3
d(1) = _2
d(2) = _5
CRC = CRC_(d) 调用CRC_计算函数
CRC(0)为高位
CRC(1)为低位
End Sub
注意:在数据传输时CRC的低位可能在前,而高位在后.
Function CRC_(data() As Byte) As String
Dim CRC_Lo As Byte, CRC_Hi As Byte CRC寄存器
Dim CL As Byte, CH As Byte 多项式码 HA_1
Dim SaveHi As Byte, SaveLo As Byte
Dim i As Integer
Dim Flag As Integer CRC_Lo = HFF
CRC_Hi = HFF
CL = H1 多项式码低位 H_
CH = HA0 多项式码高位 HA0
For i = 0 To UBound(data)
CRC_Lo = CRC_Lo _or data(i) 每一个数据与CRC寄存器进行异或
For Flag = 0 To 7
SaveHi = CRC_Hi
SaveLo = CRC_Lo
CRC_Hi = CRC_Hi 2 高位右移一位
CRC_Lo = CRC_Lo 2 低位右移一位
If ((SaveHi And H1) = H1) Then 如果高位字节最后一位为1
CRC_Lo = CRC_Lo Or H80 则低位字节右移后前面补1
End If 否则自动补0
If ((SaveLo And H1) = H1) Then 如果LSB为1,则与多项式码进行异或
CRC_Hi = CRC_Hi _or CH
CRC_Lo = CRC_Lo _or CL
End If
Ne_t Flag
发布评论