基于MD5加密算法系统安全登录研究

基于MD5加密算法的系统安全登录研究
摘要:现在许多业务系统都是基于网络环境的,虽然满足了系统应用方便,共享性好的要求,但同时在系统安全上也带来了一些问题。

如何消除安全隐患,增强登录模块的安全性,这是摆在系统建设者面前的一道课题。

md5即message-digest algorithm 5(信息-摘要算法5),用于确保信息传输完整一致,是计算机广泛使用的
杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已
有md5实现。

系统可以借助md5算法来强化安全措施,避免权限外用户浏览信息,从而提高业务系统的保密性。

关键词:md5;加密;安全登录;算法
中图分类号:tp393.08文献标识码:a文章编号:1007-9599 (2013) 06-0000-02
1系统登录安全问题概述
许多基于互联网的业务系统都提供有权限的资源服务,用户注册通过后,登录系统,才可以浏览信息参与系统的操作。

在注册过程中填写的信息,涉及到用户的个人资料等重要信息,泄露后会造成极大的隐患。

在各类业务系统中,通常会在数据库中建立用户信息数据表。

数据表中包含用户用户名、密码等信息。

一条用户的信息称为一条数据库的记录。

用户登录数据库时,会先通过网络程序访问数据库,然后在数据库中调取对应的用户名和密码。

通过校验用户输入的用户名、密码,与数据库中的信息进行比对,如果数值相同,才能通
过校验,继而进入系统。

如果校验结果不匹配,则退出登录程序。

在软件设计领域,有多种校验用户信息的技术和算法,也可以同时采用多种安全技术,来强化系统的安全性。

系统在校验密码来验证用户身份的真伪,虽然逻辑上可行性较高,但是难以避免口令猜解技术带来的隐患。

此外,黑客也会在通信信道上探窥信息,所以,传输明文口令容易被黑客截获,从而导致灭顶之灾。

由此,人们探索出口令加密的传输方式。

为确保各类业务系统的安全,对数据库等相关信息加密是非常重要的。

即便有黑客进入了数据库,但不能解密,仍然无法得到数据库中的原信息。

在加密时,要恰当选择需要加密的数据,以不超过系统最大负荷为前提。

在各类业务系统登录模块中,md5算法加密得到了广泛应用。

2md5算法在系统安全登录中的应用
md5即message-digest algorithm 5(信息-摘要算法5),用于确保信息传输完整一致,是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有md5实现。

考虑到各类基于网络的业务系统所面临的安全问题,可以借助md5算法来强化安全措施,避免权限外用户浏览信息,从而提高业务系统的保密性。

md5算法在系统安全登录中的应用主要有:
2.1系统登录方面md5算法的应用。

现在,大部分的业务系统都有在登录页面进行验证权限的算法模块,用户登录后输入用户名和密码,系统把输入的信息以明文方式传递到服务器端来校验,有的
数据库中也以明文形式存储用户名和密码,这都存在着极大的隐患。

一旦黑客伺机进入数据库,则数据库中的用户信息就暴露无遗,从而给系统带来不可预见的损失。

为了强化系统的安全性,避免用户信息泄露,在数据库中要以md5算法加密后的形式来存储,不可用明文或可逆算法来加密。

在登录过程中系统校验用户合法性时,要在登陆端导出登录信息的md5值,再与数据库中经过md5加密后的用户名、密码相比对,比对后如果等值,则用户为合法用户。

这种校验方式的优势在于,假使黑客进入的用户信息数据库,窃取了md5加密后的用户密码,也不会有太大的危害,因为md5具有不可逆性,黑客仍然得不到实际的密码值。

2.2md5算法在数据完整性方面的应用。

在传递密码或其他重要信息时,要避免数据信息被盗取,同时,还要确保信息发送者对自己所发送的文件有可追溯性,信息接收方可以明确信息发送者是谁,还能核对信息是否被篡改过,从而避免信息能准确送达且不被修改。

借助md算法来确保系统中信息安全传递的流程为:信息发送者通过网络把信息块传递给接受者乙,乙把信息块改名为n,信息发送者甲发送信息块时,由系统应用md5加密算法核算出信息块的哈希值md5值m,信息接受者乙在接受文件时,由系统应用md5算法核算出信息块的哈希值md5值n,如果md5值m和n等值,则信息块是完整准确的,原始文件在传递的过程中未受到损坏或增加,同时,信息传递者甲也可以核对传递前后信息块的哈希值,以确认乙
接收的信息块是否是自己发送给乙的,是否被篡改过。

3基于md5加密算法的系统安全登录实例分析
现在以实例来解释对传递过程中的数据进行md5算法加密:usernc=$usernc;
$this->mima=$mima;
$this->xym=$xym;
}
public function chk(){
if(trim($this->xym)!=trim($_session[“autonum”])){ echo”“;
exit;
}
include_once(“common.php”);
$sql=mysql_query(“select usernc from tb_yonghu where usernc=‘“.$this->usernc.”‘ and
pwd=‘“.$this->mima.”‘“,$conn);
$info=mysql_fetch_array($sql);
if($info==false){
echo”“;
exit;
}else{
if($_session[“unc”]!=““){
session_unregister(“unc”);
}
session_register(“unc”);
$_session[“unc”]=$this->usernc;
mysql_query(“update tb_yonghuset
logintimes=logintimes+1,lastlogintime=‘“.date(“y-m-d h:i:s”).”‘“,$conn);
echo ““;
}
}
}
$obj=new dengluyanzheng($_post[“yonghuming”],
md5($_post[“mima”]),$_post[“xym”]);//对传递的信息进行md5算法加密,增强数据安全性。

$obj->chk();
?>
通过在系统登录环节增加md5算法的调用,强化了传递信息的的安全性,有助于避免密码的泄露。

4结束语
在系统登录模块中,对密码进行md5算法加密后存储在数据库中,提高了系统的安全性。

用户的验证过程,也可以借助md5进行校验,改算法过程执行效率高,对系统负荷影响小,具有很好的可行性。

现在,md5算法得到了更为广泛的应用,有较为成熟的应用方案。

参考文献:
[1]胡天麟.基于md5的otp认证系统的原理及实现[j].信息技术(哈尔滨),2005,9.
[2]段青玲.md5算法在电话语音系统软件保护中的应用[j].微计算机信息,2007,24.
[3]王金柱.md5算法在j2ee平台下用户管理系统中的应用[j].计算机工程与设计,2008,18.
[作者简介]孙杨(1981.11-),女,汉族,辽宁大石桥市人,讲师,本科,研究方向:数据库。

合集下载

javaMD5加密及登录验证

javaMD5加密及登录验证
pwd2 = cipher.generatePassword(pwd1);
System.out.println("加密后的密码:"+pwd2);
System.out.print("验证密码是否下确:");
Login login = loginDAO.queryByUser(userName.getValue(),CipherUtil.returnEncodeByMde(password.getValue()) );
import java.security.*;
public class Encrypter
return true;
} else{
return false;
}
}
public static String returnEncodeByMde(String originString){
System.out.println("错误");
}
}
}
加密
login.setPassword(CipherUtil.generatePassword(aduser1.getValue()));
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++){
resultSb.append(byteToHexString(b[i]));
private final static String[] hexDigits = {"0", "1", "2", "3", "4",

基于MD5报文摘要算法的考试系统用户安全认证

基于MD5报文摘要算法的考试系统用户安全认证

基于MD5报文摘要算法的考试系统用户安全认证邵伯乐(亳州职业技术学院,安徽亳州236800)[摘要]用户安全认证是确保网络考试系统有效正常运行的关键因素之一。

M D5报文摘要算法具有密文长度短、安 全性高和原理简单的优点,同时能满足考试系统的最小通信量的需求。

因此,本文提出了基于M D5算法的考试系统安 全认证方法,从报文的填充和变换和缓冲器的初始化两个角度对M D5算法进行了改善,给出了采用改进的M D5算法对 用户账户进行安全认证的具体过程。

在实际运行过程中,从客户端程序和服务器程序两个方面对具体的实现过程进行 了描述。

[关键词]安全认证;报文摘要;考试系统;哈希函数[中图分类号]TP393.08 [文献标识码]A[文章编号]1671 -5330(2017)05 -0043 -03〇引言随着网络技术和信息化系统的发展,在线考 试系统作为一种新型的考试系统,使得考试可以 脱离传统形式的束缚,极大增加了考试的灵活性,使得考试系统可以既运行于本地又运行于异地。

虽然在线考试系统增加了便利性,但同时也提出 了新的要求,如对考生身份的确认、考试的计时以 及考试的评阅等。

然而,目前大多数的考试安全 认证系统仅仅从系统设计的角度来对考试安全系 统进行规范,同时都是对各孤立的安全认证进行 分别定制,缺少统一的认证方法,因此,无法适应于 规模较大的考试系统安全认ffi的需要[1]。

目前已有的考试安全系统的主要研究工作 有:李茔[2]对高校考试系统的网络安全进行了仔 细研究,在结合生物适应免疫技术和网络安全技 术的基础上,提出了一种全新的免疫考试系统,该 系统应用黑客主攻和系统被动防护相结合的方 法。

通过采用多层保护方法来实现自身反射性保 护,以提高安全性和稳定性。

张萍等[3]提出了一 种新型的基于教育网格和免疫原理的考试系统,该系统具有层次性、分布式以及主动和被动防护 等特征。

张萍等[4]结合生物自适应的免疫技术 和信息安全技术,实现了免疫网络安全考试系统。

毕业设计-md5算法的研究与实现数据存储加密—论文[管理资料]

毕业设计-md5算法的研究与实现数据存储加密—论文[管理资料]

毕业设计(论文)MD5算法的研究与实现------数据存储加密论文作者姓名:申请学位专业:申请学位类别:指导教师姓名(职称):论文提交日期:MD5算法的研究与实现------数据存储加密摘要随着网络技术的广泛应用,网络信息安全越来越引起人们的重视。

针对数据在存储的时候存在大量的安全问题,目前通常将需要存储的数据进行加密然后再存储,应用MD5算法是一个不错的选择。

MD5算法的全称是Message-Digest algorithm 5,是一种用于产生数字签名的单项散列算法。

它的作用是让大容量信息在用数字签名软件签署私人密钥前被“压缩”成一种保密的格式,即将一个任意长度的“字节串”通过一个不可逆的字符串变换算法变换成一个128bit的串。

该毕业设计是运用microsoft visual c++ ,主要是通过算法实现数据的加密存储。

文章分成五部分。

第一,二部分描述了MD5的目前现状和相关理论知识,也让我们了解MD5的定义。

重点是MD5的流程实现和封装DLL。

在MD5算法的DLL 封装这章,主要是描述我们为什么要选用封装DLL的原因,以及封装的好处。

设计流程这一部分里包含读取,修改,插入,删除这几个功能的实现情况,并用流程图的方式来分别描述了这四大功能模块的实现过程。

最后一部分显示了系统测试的内容和系统主要功能运行界面图。

关键词:信息安全;MD5;加密;封装The Research and Implementation for MD5 Algorithm-------- Data Storage and EncryptionAbstractWith the wide application of the network technology, the information of the network safety causes people's attention more and more. A large number of security questions appear while storing data, the data that usually store needing at present are encrypted then stored, it is a good choice to use MD5 algorithm. The full name of MD5 algorithm is Message-Digest algorithm 5, is that a kind of individual event used for producing figures and signed breaks up and arranges algorithms. Its function is to let large capacity information " compress " and become a kind of secret form before signing the private key with the digital signature software, vary " byte bunch " of a wanton length into a great integer of one 128bit through an irreversible one bunch of algorithms of varying of character .Used Microsoft Visual C++ software and developed in this graduation project, is mainly to realize through the algorithm that the encryption of the data is stored. The article is divided into five parts. The first and second parts are describing the current situation and relevant theory knowledge at present of MD5, let us understand the definition of MD5. The focal point is the procedure of MD5 is realized and encapsulation to Dynamic Link Library. In this chapter of encapsulation MD5 class library to Dynamic Link Library, mainly describe why we will select encapsulation Dynamic Link Library for use , and the advantage of encapsulation . Design this of procedure and include reading in the part , revise , insert, delete the realization situations of these functions, and has described the realization course of this four major functions module respectively in way of the flow chart . The last part has shown that the content of system testing and main function of system operate the interface picture .Key words: information security; MD5; encrypt; Packaging目录论文总页数:23页1 引言 (1)研究现状 (1)选题意义 (2)选题背景 (2)2 相关理论基础 (3)单向散列函数 (3)单向散列函数的基本原理 (3)散列值的长度 (4)MD5算法的基本原理 (4)MD5的应用 (12)3 需求分析及设计方案 (14)主要功能模块 (14)数据加密 (14)数据存储 (14)数据库设计 (14)主要流程图 (15)4 MD5算法的DLL封装 (15)加载时动态链接 (16)运行时动态链接 (16)DLL封装情况 (16)5 具体设计流程及实现 (17)读取的设计和实现 (17)插入的设计和实现 (18)修改的设计和实现 (18)删除的设计和实现 (19)6 调试与分析 (19)概述 (19)测试分析报告 (20)结论 (20)参考文献 (21)致谢 (22)声明 (23)1引言随着网络通信技术和Internet的联系日益增强,出现了一系列与网络安全相关的问题:如对主机的攻击,网络上传输的信息被截取、篡改、重发等,由此,它对网络应用的进一步推广构成了巨大威胁,因此密码体制[1]就在这种背景下应运而生了。

MD5加密算法探究及其应用

MD5加密算法探究及其应用

MD5加密算法探究及其应用引言MD5加密算法作为一种免费的加密算法,广泛地应用于计算机,数据安全传输,数字签名认证等安全领域.MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),是由Ron Rivest (RSA 算法的发明人之一,于2002年获得图灵奖)于90年代初提出,经MD2,MD3和MD4发展而来的.Rivest 最早于1989年提出了MD2算法针对8位计算机做了优化,为了提高算法的安全性与稳定性,Rivest在1990年又开发出MD4算法,但人们很快发现了MD4算法的漏洞.随后在1991年,Rivest开发出来技术上更加稳定安全更趋于成熟的MD5算法.1993年,美国国家标准和技术协会(NIST)提出了安全散列算法(SHA).1995年又发布了一个修订版,即SHA-1.SHA-1与MD5均由MD4导出,所以彼此很相似.相应的,它们的强度和其他特征也是相似的.2004年8月17日于美国加州圣巴巴拉召开的国际密码学会议(Crypto 2004)上,来自山东大学的王小云教授做了破译MD5,HAV AL-128,MD4和RIPEMD算法的报告,宣告了MD系列算法的破解.对于一个进行身份认证的摘要算法来说,MD5已经是不安全了,但是很多实际的应用领域MD5还有它的使用价值的,所以我们分析探究它的加密原理,我们在此基础上对它的加密进行改进利用,对于我们今后的加密安全工作还是很有帮助的.1.预备知识1.1 Hash函数Hash函数是一种将任意长度的信息压缩到某一固定长度的消息摘要的函数,又称Hash 算法.Hash函数必须满足一定的安全条件.这里主要介绍三个主要的方面:单向性,弱抗碰撞性,强碰撞性.单向性是指对Hash函数h而言,又x计算h(x)是容易的,但从h(x)计算x是不可行的.一个弱碰撞的Hash函数是满足下列条件的一个函数h:h的输入可以是任意长度的消息或文件ph的输出长度是固定的给定h和M,计算h(p)是很容易的给定h和一个随机选择的消息p1,找到另一个消息p2,p1 p2使得h(p1)=h(p2)计算上是不可行的.一个强碰撞的Hash 函数是满足下列条件的一个函数h : h 的输入 可以是任意长度的消息或文件p h 的输出长度是固定的给定h 和M ,计算h (p )是很容易的给定h ,找到两个不同的消息p1,p2 ,使得h (p1)=h (p2)在计算上是不可行的. (如果有两个不同的消息M 1,M 2,使得h (M 1)=h (M 2),我们就说这两个消息是碰撞的)1.2 16进制的相关知识十六进制在数学中是一种逢16进1的进位制,一般用数字0到9和字母A 到F 表示(A-F 表示10-15).十六进制转换成二进制的比特流(第一列16进制,第二列2进制)例如:十六进制为9FD ,那么在计算机中二进制表示100111111101(9=1001,F=1111,D=1101) 1.3 逻辑运算① 逻辑“与”运算,用“∧”表示 真值表表示为二进制按位逻辑“与”运算,即逐位进行逻辑“与”运算,并将逐位逻辑运算的结果进行组合得到的结果.例如①:如果01110001=x ,11001001=y ,那么01000001=∧y x 例如②:如果1667FD x =,1647AD y =,那么?=∧y x首先把1667FD x =转换为二进制为1111010110011111;其次把1647AD y =转换而二进制位1011010100011110; 最后按位进行逻辑“与”运算结果为1011010100011110 ② 逻辑“或”运算,用“|”表示 真值表表示为:③ 逻辑“异或”运算,用“⊕”表示真值表表示为:④ 逻辑“取反”运算二进制数的所有0改为,1改为0,这个过程叫“取反” 例如:如果1100011001=x ,那么0011100110=-x 1.4 模运算 基本概念给定一个正整数p ,任意一个整数n ,一定存在等式 r kp n += ;其中r k ,是整数,且 p r <≤0,称k 为n 除以p 的商,r 为n 除以p 的余数.对于正整数p 和整数b a ,,定义如下运算:模p 加法:p b a )%(+ ,其结果是b a +算术和除以p 的余数,也就是说,r kp b a +=+)(,则r p b a =+)%(例如:1647876aa d x =,1675678b c e y =,那么?=+y x (注这里“+”是模322加法运算)首先将1647876aa d x =转换为二进制为00010001111010101010101101011101; 其次将1675678b c e y =转换为二进制为 10011101010100011110111110100011 然后逐位相加结果为22111111121011212021021102121110因为实行的是二进制数据,逢2向前一位进1,所以最终结果为:111000000001100100110001111001110,这个结果的十进制是:323130212017141398763212222222222222227442450944++++++++++++++=,然后模322,结果为3224527822,它的二进制表示为:110000000011001001100011110011102. MD5加密算法的原理简单的说,MD5加密以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过一系列的处理后,算法的输出有4个32位分组组成,将这4个32位分组级联后将生成一个128位散列值. 第一步:消息的填充如果输入的消息的长度(以bit 位单位)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448,填充的方法是附加一个“1”在消息后面,再补充多个“0”,然后在其后附上64比特的消息长度(填充前)的二进制表示.这两步的作用是使最终填充后的消息恰好是512比特的整倍长,同时确保不同的消息在填充后不会相同. 第二步:记录消息长度用64位来存储填充前消息长度,这64位加在第一步结果的后面,这样消息长度就变为N*512+448+64=(N+1)*512(bits ). 第三步:加载初始标准数据算法中使用了四个32比特的变量A ,B ,C ,D ,先将这四个变量初始化为:01234567=A A B C D E F B 89= 98FEDCBA C = 76543210=D 称它们为链接变量,接着进行算法的主循环,循环的次数是消息中512比特的块的数目. 将上面四个标准变量复制到另外四个变量中:A 到a ,B 到b ,C 到c ,D 到d 第四步:四轮循环运算循环的次数是分组的个数(N+1),每轮循环都很相似,每次操作对abcd 中的其中三个作一次非线性函数运算,然后将所得的结果加上第四个变量,文本的一个子分组和一个常数,再将所得结果向左位移一个不定的数,并加上a ,b ,c ,d 中之一,最后用该结果取代a ,b ,c ,d 中之一.设XY 表示输入的块,下面描述一些运算: (1)y x ∧表示x 与y 按位逻辑“与”运算 (2)y x |表示与y 按位逻辑“或”运算(3)y x ⊕表示x 与y 按位逻辑“异或”运算 (4)-x 表示x 的按位逻辑取“反” (5)x +y 表示整数模322加法运算 (6)s x 表示将x 循环左移s 个单位 有四个非线性函数,每轮一个)(),,(),,()(|)(),,()(|)(),,(---∨⊕=⊕⊕=∧∧=∧∧=z x y z y x I zy x z y x H z y z x z y x G z x y x z y x F这四个函数的说明:如果x ,y ,z 的对应的位是独立和均匀的,那么结果的每一位也应该是均匀的.其中F 是一个逐位运算的函数,即,如果x ,那么y ,否则z .函数H 是逐位奇偶操作符.(其中“∧”是逻辑“与”运算,“|”是逻辑“或”运算,“⊕”逻辑“异或”运算,“-”逻辑“取反”运算) 四轮运算是:假设j M 表示消息的第j 个子分组(从0到15),s 表示循环左移s 位),,,,,,(i j t s M d c b a FF 表示))),,((((s t M d c b F a b a i j++++= ),,,,,,(i j t s M d c b a GG 表示))),,((((s t M d c b G a b a i j++++= ),,,,,,(i j t s M d c b a HH 表示))),,((((s t M d c b H a b a i j++++=),,,,,,(i j t s M d c b a II 表示))),,((((s t M d c b I a b a i j ++++=这四轮(64步)是: 第一轮⑴)47876,7,,,,,(0aa d M d c b a FF ⑵ )75678,12,,,,,(1b c e M c b a d FF⑶)24070,17,,,,,(2db M b a d c FF ⑷ )1,22,,,,,(3bdceee c M a d c b FF ⑸)057,7,,,,,(4faf c f M d c b a FF ⑹ )624787,12,,,,,(5a c M c b a d FF ⑺)8304613,17,,,,,(6a M b a d c FF ⑻ )469501,22,,,,,(7fd M a d c b FF ⑼)8698098,7,,,,,(8d M d c b a FF ⑽ )7448,12,,,,,(9af f b M c b a d FF ⑾)15,17,,,,,(10bb ffff M b a d c FF ⑿ )7895,22,,,,,(11be cd M a d c b FF ⒀)9011226,7,,,,,(12b M d c b a FF ⒁ )987193,12,,,,,(13fd M c b a d FF ⒂)679438,17,,,,,(14e a M b a d c FF ⒃ )4082149,22,,,,,(15b M a d c b FF 第二轮⑴)256261,5,,,,,(1e f M d c b a GG ⑵)340040,9,,,,,(6b c M c b a d GG ⑶)515265,14,,,,,(11a e M b a d c GG ⑷)769,20,,,,,(0aa c b e M a d c b GG ⑸)10562,5,,,,,(5d f d M d c b a GG ⑹)02441453,9,,,,,(10M c b a d GG ⑺)68118,14,,,,,(15e a d M b a d c GG ⑻)837,20,,,,,(4fbc d e M a d c b GG ⑼)6121,5,,,,,(9cde e M d c b a GG ⑽)633707,9,,,,,(14d c M c b a d GG ⑾)87504,14,,,,,(3d d f M b a d c GG ⑿)14455,20,,,,,(8ed a M a d c b GG ⒀)90539,5,13,,,,(e e a M d c b a GG ⒁)83,9,,,,,(2f fcefa M c b a d GG ⒂)902676,14,,,,,(7d f M b a d c GG ⒃)8428,20,,,,,(12a c a d M a d c b GG 第三轮⑴)3942,4,,,,,(5fffa M d c b a HH ⑵)6818771,11,,,,,(8f M c b a d HH ⑶)612296,16,,,,,(11d d M b a d c HH ⑷)5380,23,,,,,(14c fde M a d c b HH ⑸)444,4,,,,,,(1beea a M d c b a HH ⑹)94,11,,,,,(4bdecfa M c b a d HH ⑺)6046,16,,,,,(7b bb f M b a d c HH ⑻)70,23,,,,,(10bebfbc M a d c b HH ⑼)67289,4,,,,,(13ec b M d c b a HH ⑽)127,11,,,,,(10fa eaa M c b a d HH ⑾)30854,16,,,,,(3ef d M b a d c HH ⑿)0504881,23,,,,,(6d M a d c b HH⒀)03949,4,,,,,(9d d d M d c b a HH ⒁)5996,11,,,,,(12e db e M c b a d HH ⒂)8271,16,,,,,(15cf fa M b a d c HH ⒃)56654,23,,,,,(2ac c M a d c b HH 第四轮⑴)4292244,6,,,,,(0f M d c b a II ⑵)97432,10,,,,,(7aff M c b a d II ⑶)79423,15,,,,,(14a ab M b a d c II ⑷)03993,21,,,,,(5a fc M a d c b II ⑸)359655,6,,,,,(12c b M d c b a II ⑹)9208,10,,,,,(3ccc f M c b a d II ⑺ )47,15,,,,,(10d ffeff M b a d c II ⑻)185845,21,,,,,(1dd M a d c b II ⑼)4876,6,,,,,(8f e fa M d c b a II ⑽)062,10,,,,,(15e ce fe M c b a d II ⑾)3014314,15,,,,,(6a M b a d c II ⑿)108114,21,,,,,(13a e M a d c b II ⒀)827537,6,,,,,(4e f M d c b a II ⒁)2353,10,,,,,(11af bd M c b a d II ⒂)272,15,,,,,(2bb d ad M b a d c II ⒃)39186,21,,,,,(9d eb M a d c b II其中常数i t 可以如下选择:在第i 步中,i t 是))(sin(4294967296i abs *的整数部分,i 的单位是弧度.4294967296(等于2的32次方).所有这些完成之后,将A 、B 、C 、D 分别加上a 、b 、c 、d .然后用下一分组数据继续运行算法,最后的输出是A 、B 、C 和D 的级联. 3.运算原理简举例例如:计算)47876,7,,,,,(0aa d M d c b a FF解: 不妨假设:要加密的信息为abc ,其比特串为01100001 01100010 01100011它的长度是24位,于是添加1个“1”,423个“0”,再加上64比特串(24)16=00000000 0000001816即x=01100001 01100010 01100011 1 0…0 00000000 00000018,共512比特,只有16分组为1514131211109876543210,,,,,,,,,,,,,,,M M M M M M M M M M M M M M M M ,所以有011000010=M 011000101=M 011000102=M100000003=M1413121110987654M M M M M MM MMMM===========0000000015M =00000018首先计算出 A=1601234567=0000 0001 0010 0011 0100 0101 0110 0111=aB=1689ABCDEF =1000 1001 1010 1011 1100 1101 1110 1111=bC=1698FEDCBA =1111 1110 1101 1100 1011 1010 1001 1000=c D=1676543210=0111 0110 0101 0100 0011 0010 0001 0000=d其次计算)(|)(),,(d b c b d c b F ∧∧=-=(1000 1001 1010 1011 1100 1101 1110 1111∧1111 1110 1101 1100 1011 1010 1001 1000)|(0111 0110 0101 0100 0011 0010 0001 0000∧0111 0110 0101 0100 0011 0010 0001 0000)=(1000 1000 1000 1000 1000 1000 1000 1000)|(0111 0110 0101 0100 0011 0010 0001 0000)=1111 1110 1101 1100 1011 1010 1001 10001647876aa d 转换为二进制为1101 0111 0110 1010 1010 0100 0111 1000)47876,7,,,,,(0aa d M d c b a FF 结果为 )7)),,((((00t Md c b F a b a ++++==(1000 1001 1010 1011 1100 1101 1110 1111)+((0000 0001 0010 0011 0100 0101 0110 0111+1111 1110 1101 1100 1011 1010 1001 1000+0000 0001 0001 0000 0000 0000 0001 0000)+ 1101 0111 0110 1010 1010 0100 0111 1000)7 )=(1000 1001 1010 1011 1100 1101 1110 1111)+((0000 0000 0011 1000 0000 0000 0000 1111+1101 0111 0110 1010 1010 0100 0111 1000)7 )=(1000 1001 1010 1011 1100 1101 1110 1111)+(1101 0111 1010 0010 1010 0100 1000 01117 )=(1000 1001 1010 1011 1100 1101 1110 1111)+(0000 1111 1010 1111 0100 0101 0100 1001) =1001 1001 0101 1011 0001 0011 0011 1000=955b133816这样就计算出第一步的运算,下面的运算和上面的运算类同就不在这里浪费篇幅. 4.MD5加密算法的安全性分析关于加密算法的分析就重来没有停止过,现有的加密算法的密钥动辄就256,为强行破解提供了很大的障碍;随着计算机速度的提高,位数还在增减,对密码的分析就成为唯一的突破 口.由上面的MD5加密的原理,我们知道,其加密主要有三步: (1)对字符串的填充 (2)分段求摘要 (3)最终摘要的输出第一步和第三步都不是MD5算法的核心,也不是碰撞的可能发生地,所以下面的介绍还是分析和讨论都是基于第二步进行的 4.1各步的碰撞的分析)(),,(),,()(|)(),,()(|)(),,(---∨⊕=⊕⊕=∧∧=∧∧=z x y z y x I zy x z y x H z y z x z y x G z x y x z y x F不妨取(x ,y ,z )=(1,1,1),(1,1,0),(1,0,0) ,(1,0,1)(0,0,1),(0,1,1),(0,1,0),(0,0,0)经过分析就可以得到: 结论一:F=0,当且仅当(x ,y ,z )∈{(0,0,0),(0,1,0) ,(1,0,0), (1,0,1)} F=1, 当且仅当(x ,y ,z )∈{(1,1,1),(1,1,0),(0,0,1),(0,1,1)} 结论二:G=0,当且仅当(x ,y ,z )∈{(0,0,0),(0,0,1),(0,1,1),(1,0,0)} G=1,当且仅当(x ,y ,z )∈{(0,1,0), (1,0,1),(1,1,0), (1,1,1)} 结论三:H=0,当且仅当(x ,y ,z )∈{(0,0,0),(0,1,1),(1,0,1),(1,1,1)} H=1,当且仅当(x ,y ,z )∈{(0,0,1),(0,1,0), (1,0,0),(1,1,0)} 结论四:I=0,当且仅当(x ,y ,z )∈{(0,0,1),(0,1,0), (1,1,0),(1,1,1)} I=1,当且仅当(x ,y ,z )∈{(0,0,0),(0,1,1),(1,0,1),(1,0,0)从文献[7]可以知道,在使用相应的概率分析就会产生一定概率的碰撞 4.2各圈碰撞的分析从文献[7]可以知道,要产生对第一轮的碰撞,只需要在报文i M 中修改三位就可以了,设},,,{15,1,0,i i i i m m m M 中的最高位,或者相应的位就会出现一定概率的碰撞. 5.MD5加密技术的实际应用举例MD5加密技术广泛应用于数字签名领域,它的典型应用是对一段信息产生信息摘要,以防止被篡改.比如在发布软件的时候,经常会有一个文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:MD5:a5fdfeb0af54ef8397c4ea4a06e25d8f ,这就是该软件文件的数字签名,MD5将整个文件当做一个大文本信息,通过其不可逆的字符串变换算法,产生了这个MD5信息摘要.在以后传播这个文件的过程中,只要文件的内容发生任何形式的改变(包括人为的修改或者下载过程中线路不稳定引起的传输错误等,换句话说,哪怕源文件的一个字符被改变,MD5值也会发生改变),在对这个文件重新计算MD5值时就会发现信息摘要不相同,由此可以判定得到的文件是否被篡改.如果再配合一个第三方认证机构,利用MD5加密技术还可以防止文件作者的“抵赖”.MD5还广泛用于加密保密信息上.如对于数据库中登陆密码一般都是经过MD5加密后存放的.当登陆的时候,根据用户填报的密码生成相应的MD5值再与数据库中的信息对比,从而判定登陆的合法性,但实际中如果把用户的密码MD5处理后再存储到数据库中是不安全的.因为用户的密码往往是比较短的,而且很多用户的密码都是使用生日,身份证等比较熟悉的号码,常用的一些吉利的数字以方便记忆,如果把常用的密码先经过MD5处理形成MD5值集群,然后把要破译的MD5结果相匹配,就可能找到原文.因此,对于MD5加密保密信息时,一般需要同时设置一个随机附加值来保证密码的安全性.例如:某用户的注册密码为“move ”,则在将密码保存至数据库时应当先在密码原文后附加一个随机附加值,比如附加值为“8dx9087h ”,然后将带有附加值的密码经过MD5加密,即将“move8dx9087h ”做为原密码进行加密,然后存入数据库中,同时将随机附加码也存入数据库中.在检测用户登陆密码时,则将用户输入的密码与数据库中的附加码共同进行MD5加密后进行对比.这样可以有效地降低通过密文比对获得密码原码的可能性. 6.MD5加密算法的改进意见研究的实质是为了对现有的运用提供借鉴,对未来的应用提供前瞻性的认识.研究MD5算法就是为了怎样使得碰撞更难通过分析实现.以下是对Hash 算法的改进策略:(1)增加Hash运算的轮数.轮数越多,其计算空间越大,进行运算的计算量就会成百倍成千万倍的增加,这样在无形中就会增加密码破译的难度,这样密码的安全系数就会升高,达到预定的安全指数.(2)模运算和位运算是加密算法的主要计算过程.可以尝试使用新的理论去实现加密思想,而不单单是运用类同的模运算,可以使用数论,离散对数,椭圆曲线等知识,从根本上做到创新.(3)Hash算法的其他设计方法的研究.现在无论是SHA-1,HA VAL-128还是RIPEMD都在一定程度上仿照了MD5加密算法,无论是从消息的填充还是从核心的模运算,位运算都有惊人的相似之处,所以研究新的加密算法已经迫在眉睫,理论创新才是真正的出路.7. 附录VB6.0中实现MD5改进后的加密算法Private Const BITS_TO_A_BYTE = 8Private Const BYTES_TO_A_WORD = 4Private Const BITS_TO_A_WORD = 32Private m_lOnBits(30)Private m_l2Power(30)Private Function LShift(lV alue, iShiftBits) ’定义左移函数If iShiftBits = 0 ThenLShift = lV alueExit FunctionElseIf iShiftBits = 31 ThenIf lV alue And 1 ThenLShift = &H80000000ElseLShift = 0End IfExit FunctionElseIf iShiftBits < 0 Or iShiftBits > 31 ThenErr.Raise 6If (lV alue And m_l2Power(31 - iShiftBits)) ThenLShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000ElseLShift = ((lV alue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits))End IfEnd FunctionPrivate Function RShift(lValue, iShiftBits) ’定义右移函数If iShiftBits = 0 ThenRShift = lV alueExit FunctionElseIf iShiftBits = 31 ThenIf lV alue And &H80000000 ThenRShift = 1ElseRShift = 0End IfExit FunctionElseIf iShiftBits < 0 Or iShiftBits > 31 ThenErr.Raise 6End IfRShift = (lValue And &H7FFFFFFE) \ m_l2Power(iShiftBits)If (lV alue And &H80000000) ThenRShift = (RShift Or (&H40000000 \ m_l2Power(iShiftBits - 1)))End IfEnd FunctionPrivate Function RotateLeft(lV alue, iShiftBits) ’定义循环左移函数End FunctionPrivate Function AddUnsigned(lX, lY) ’定义模322加法运算Dim lX4Dim lY4Dim lX8Dim lY8Dim lResultlX8 = lX And &H80000000lY8 = lY And &H80000000lX4 = lX And &H40000000lY4 = lY And &H40000000lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF)If lX4 And lY4 ThenlResult = lResult Xor &H80000000 Xor lX8 Xor lY8ElseIf lX4 Or lY4 ThenIf lResult And &H40000000 ThenlResult = lResult Xor &HC0000000 Xor lX8 Xor lY8ElselResult = lResult Xor &H40000000 Xor lX8 Xor lY8End IfElselResult = lResult Xor lX8 Xor lY8End IfAddUnsigned = lResultEnd FunctionPrivate Function md5_F(x, y, z)md5_F = (x And y) Or ((Not x) And z)End FunctionPrivate Function md5_G(x, y, z)md5_G = (x And z) Or (y And (Not z))End FunctionPrivate Function md5_H(x, y, z)md5_H = (x Xor y Xor z)End FunctionPrivate Function md5_I(x, y, z)md5_I = (y Xor (x Or (Not z)))End FunctionPrivate Sub md5_FF(a, b, c, d, x, s, ac)a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac))a = RotateLeft(a, s)a = AddUnsigned(a, b)End SubPrivate Sub md5_GG(a, b, c, d, x, s, ac)a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac))a = RotateLeft(a, s)a = AddUnsigned(a, b)End SubPrivate Sub md5_HH(a, b, c, d, x, s, ac)a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac))a = RotateLeft(a, s)a = AddUnsigned(a, b)End SubPrivate Sub md5_II(a, b, c, d, x, s, ac)a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))a = RotateLeft(a, s)a = AddUnsigned(a, b)End SubPrivate Function ConvertToWordArray(sMessage)Dim lMessageLengthDim lWordArray()Dim lBytePositionDim lByteCountDim lWordCountConst MODULUS_BITS = 512Const CONGRUENT_BITS = 448lMessageLength = Len(sMessage)lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ (MODULUS_BITS \ BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS \ BITS_TO_A_WORD)ReDim lWordArray(lNumberOfWords - 1)lBytePosition = 0lByteCount = 0Do Until lByteCount >= lMessageLengthlWordCount = lByteCount \ BYTES_TO_A_WORDlBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTElWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), lBytePosition)lByteCount = lByteCount + 1LooplWordCount = lByteCount \ BYTES_TO_A_WORDlBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTElWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition)lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29)ConvertToWordArray = lWordArrayEnd FunctionPrivate Function WordToHex(lV alue)Dim lByteFor lCount = 0 To 3lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1)WordToHex = WordToHex & Right("0" & Hex(lByte), 2)NextEnd FunctionPublic Function MD5(sMessage)m_lOnBits(0) = CLng(1)m_lOnBits(1) = CLng(3)m_lOnBits(2) = CLng(7)m_lOnBits(3) = CLng(15)m_lOnBits(4) = CLng(31)m_lOnBits(5) = CLng(63)m_lOnBits(6) = CLng(127)m_lOnBits(7) = CLng(255)m_lOnBits(8) = CLng(511)m_lOnBits(9) = CLng(1023)m_lOnBits(10) = CLng(2047)m_lOnBits(11) = CLng(4095)m_lOnBits(12) = CLng(8191)m_lOnBits(13) = CLng(16383)m_lOnBits(14) = CLng(32767)m_lOnBits(15) = CLng(65535)m_lOnBits(16) = CLng(131071)m_lOnBits(17) = CLng(262143)m_lOnBits(18) = CLng(524287)m_lOnBits(19) = CLng(1048575)m_lOnBits(20) = CLng(2097151)m_lOnBits(21) = CLng(4194303)m_lOnBits(22) = CLng(8388607)m_lOnBits(25) = CLng(67108863) m_lOnBits(26) = CLng(134217727) m_lOnBits(27) = CLng(268435455) m_lOnBits(28) = CLng(536870911) m_lOnBits(29) = CLng(1073741823) m_lOnBits(30) = CLng(2147483647) m_l2Power(0) = CLng(1)m_l2Power(1) = CLng(2)m_l2Power(2) = CLng(4)m_l2Power(3) = CLng(8)m_l2Power(4) = CLng(16)m_l2Power(5) = CLng(32)m_l2Power(6) = CLng(64)m_l2Power(7) = CLng(128)m_l2Power(8) = CLng(256)m_l2Power(9) = CLng(512)m_l2Power(10) = CLng(1024)m_l2Power(11) = CLng(2048)m_l2Power(12) = CLng(4096)m_l2Power(13) = CLng(8192)m_l2Power(14) = CLng(16384)m_l2Power(15) = CLng(32768)m_l2Power(16) = CLng(65536)m_l2Power(17) = CLng(131072)m_l2Power(18) = CLng(262144)m_l2Power(19) = CLng(524288)m_l2Power(20) = CLng(1048576)m_l2Power(21) = CLng(2097152)m_l2Power(22) = CLng(4194304)m_l2Power(25) = CLng(33554432) m_l2Power(26) = CLng(67108864) m_l2Power(27) = CLng(134217728) m_l2Power(28) = CLng(268435456) m_l2Power(29) = CLng(536870912) m_l2Power(30) = CLng(1073741824) Dim x,k,AA,BB,CC,DD,a,b,c,d Const S11 = 7Const S12 = 12Const S13 = 17Const S14 = 22Const S21 = 5Const S22 = 9Const S23 = 14Const S24 = 20Const S31 = 4Const S32 = 11Const S33 = 16Const S34 = 23Const S41 = 6Const S42 = 10Const S43 = 15Const S44 = 21x = ConvertToWordArray(sMessage)a = &H67452301b = &HEFCDAB89c = &H98BADCFEd = &H10325476For k = 0 To UBound(x) Step 16BB = bCC = cDD = dmd5_FF a, b, c, d, x(k + 0), S11, &HD76AA478 md5_FF d, a, b, c, x(k + 1), S12, &HE8C7B756 md5_FF c, d, a, b, x(k + 2), S13, &H242070DB md5_FF b, c, d, a, x(k + 3), S14, &HC1BDCEEE md5_FF a, b, c, d, x(k + 4), S11, &HF57C0FAF md5_FF d, a, b, c, x(k + 5), S12, &H4787C62A md5_FF c, d, a, b, x(k + 6), S13, &HA8304613 md5_FF b, c, d, a, x(k + 7), S14, &HFD469501 md5_FF a, b, c, d, x(k + 8), S11, &H698098D8 md5_FF d, a, b, c, x(k + 9), S12, &H8B44F7AF md5_FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1 md5_FF b, c, d, a, x(k + 11), S14, &H895CD7BE md5_FF a, b, c, d, x(k + 12), S11, &H6B901122 md5_FF d, a, b, c, x(k + 13), S12, &HFD987193 md5_FF c, d, a, b, x(k + 14), S13, &HA679438E md5_FF b, c, d, a, x(k + 15), S14, &H49B40821 md5_GG a, b, c, d, x(k + 1), S21, &HF61E2562 md5_GG d, a, b, c, x(k + 6), S22, &HC040B340 md5_GG c, d, a, b, x(k + 11), S23, &H265E5A51 md5_GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA md5_GG a, b, c, d, x(k + 5), S21, &HD62F105D md5_GG d, a, b, c, x(k + 10), S22, &H2441453 md5_GG c, d, a, b, x(k + 15), S23, &HD8A1E681 md5_GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8 md5_GG a, b, c, d, x(k + 9), S21, &H21E1CDE6 md5_GG d, a, b, c, x(k + 14), S22, &HC33707D6 md5_GG c, d, a, b, x(k + 3), S23, &HF4D50D87md5_GG a, b, c, d, x(k + 13), S21, &HA9E3E905 md5_GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8 md5_GG c, d, a, b, x(k + 7), S23, &H676F02D9 md5_GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A md5_HH a, b, c, d, x(k + 5), S31, &HFFFA3942 md5_HH d, a, b, c, x(k + 8), S32, &H8771F681 md5_HH c, d, a, b, x(k + 11), S33, &H6D9D6122 md5_HH b, c, d, a, x(k + 14), S34, &HFDE5380C md5_HH a, b, c, d, x(k + 1), S31, &HA4BEEA44 md5_HH d, a, b, c, x(k + 4), S32, &H4BDECFA9 md5_HH c, d, a, b, x(k + 7), S33, &HF6BB4B60 md5_HH b, c, d, a, x(k + 10), S34, &HBEBFBC70 md5_HH a, b, c, d, x(k + 13), S31, &H289B7EC6 md5_HH d, a, b, c, x(k + 0), S32, &HEAA127FA md5_HH c, d, a, b, x(k + 3), S33, &HD4EF3085 md5_HH b, c, d, a, x(k + 6), S34, &H4881D05 md5_HH a, b, c, d, x(k + 9), S31, &HD9D4D039 md5_HH d, a, b, c, x(k + 12), S32, &HE6DB99E5 md5_HH c, d, a, b, x(k + 15), S33, &H1FA27CF8 md5_HH b, c, d, a, x(k + 2), S34, &HC4AC5665 md5_II a, b, c, d, x(k + 0), S41, &HF4292244md5_II d, a, b, c, x(k + 7), S42, &H432AFF97md5_II c, d, a, b, x(k + 14), S43, &HAB9423A7 md5_II b, c, d, a, x(k + 5), S44, &HFC93A039 md5_II a, b, c, d, x(k + 12), S41, &H655B59C3 md5_II d, a, b, c, x(k + 3), S42, &H8F0CCC92 md5_II c, d, a, b, x(k + 10), S43, &HFFEFF47D md5_II b, c, d, a, x(k + 1), S44, &H85845DD1 md5_II a, b, c, d, x(k + 8), S41, &H6FA87E4F md5_II d, a, b, c, x(k + 15), S42, &HFE2CE6E0md5_II b, c, d, a, x(k + 13), S44, &H4E0811A1 md5_II a, b, c, d, x(k + 4), S41, &HF7537E82 md5_II d, a, b, c, x(k + 11), S42, &HBD3AF235 md5_II c, d, a, b, x(k + 2), S43, &H2AD7D2BB md5_II b, c, d, a, x(k + 9), S44, &HEB86D391a = AddUnsigned(a, AA)b = AddUnsigned(b, BB)c = AddUnsigned(c, CC)d = AddUnsigned(d, DD)NextMD5 = LCase(WordToHex(b) & WordToHex(c)) End FunctionPrivate Sub command1_click()old$ = UCase(MD5(Text1.Text))nu$ = ""For i = 1 To Len(old$)a$ = Mid$(old$, i, 1)code = Asc(a$) + 5If code >= 255 Thencode = code - 255End Ifnu$ = nu$ & Chr$(code)Next iText2.Text = nu$Text4.Text = UCase(MD5(Text1.Text))End SubPrivate Sub Command2_Click()old$ = ""nu$ = Text2.Texta$ = Mid$(nu$, i, 1)code = Asc(a$) - 5If code <= 0 Thencode = code + 255End Ifold$ = old$ + Chr$(code)Next iText3.Text = old$End Sub例如:在VB 6.0中使用刚才编辑好的改进的程序,输入要加密的字符串19850405,MD5加密结果为51E5A9C677E8FB56,但是实行改进代码加密后,结果就变成了”:6J:F>H;<<J=KG:;”,这样就是找到改进后的加密伪代码”:6J:F>H;<<J=KG:;”,在不知道加密代码的情况下,也很难还原出来原来的密码。

MD5算法研究

MD5算法研究

综述MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。

它的作用是让大容量信息在用数字签名软件签署私人密匙前被压缩成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。

不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。

虽然这些算法的结构或多或少有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。

这三个算法的描述和C 语言源代码在Internet RFCs 1321中有详细的描述(/rfc/rfc1321.txt),这是一份最权威的文档,由Ronald L. Rivest 在1992年8月向IEFT提交。

Rivest在1989年开发出MD2算法。

在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。

然后,以一个16位的检验和追加到信息末尾。

并且根据这个新产生的信息计算出散列值。

后来,Rogier和Chauvaud发现如果忽略了检验和将产生MD2冲突。

MD2算法的加密后结果是唯一的--既没有重复。

为了加强算法的安全性,Rivest在1990年又开发出MD4算法。

MD4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度mod 512 = 448)。

然后,一个以64位二进制表示的信息的最初长度被添加进来。

信息被处理成512位Damg?rd/Merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。

Den Boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。

安全登录系统实验报告

安全登录系统实验报告

一、实验目的1. 理解安全登录系统的基本原理和设计方法。

2. 掌握常见的安全登录技术,如密码加密、验证码等。

3. 能够设计和实现一个简单的安全登录系统。

二、实验环境1. 操作系统:Windows 102. 开发工具:Visual Studio 20193. 编程语言:C#4. 数据库:MySQL三、实验内容1. 系统需求分析2. 系统设计3. 系统实现4. 系统测试四、实验步骤1. 系统需求分析(1)用户注册:用户输入用户名、密码、邮箱等基本信息进行注册。

(2)用户登录:用户输入用户名、密码进行登录。

(3)密码加密:使用MD5加密算法对用户密码进行加密存储。

(4)验证码:在登录界面添加验证码,防止恶意登录。

(5)权限控制:根据用户角色进行权限控制。

2. 系统设计(1)数据库设计创建用户表(user):字段名 | 类型 | 说明--- | --- | ---id | int | 用户ID,主键,自增username | varchar | 用户名password | varchar | 密码(加密)email | varchar | 邮箱role | varchar | 角色类型create_time | datetime | 注册时间(2)功能模块设计- 用户注册模块:接收用户输入的基本信息,对密码进行加密后存储到数据库。

- 用户登录模块:接收用户输入的用户名和密码,验证用户信息,判断是否登录成功。

- 密码加密模块:使用MD5加密算法对用户密码进行加密。

- 验证码模块:生成验证码,并验证用户输入的验证码是否正确。

- 权限控制模块:根据用户角色判断用户是否有权限访问特定功能。

3. 系统实现(1)密码加密```csharpusing System;using System.Security.Cryptography;using System.Text;public static string MD5Encrypt(string str){using (MD5 md5 = MD5.Create()){byte[] bytes = Encoding.UTF8.GetBytes(str);byte[] result = puteHash(bytes);StringBuilder sb = new StringBuilder();for (int i = 0; i < result.Length; i++){sb.Append(result[i].ToString("x2"));}return sb.ToString();}}```(2)验证码生成与验证```csharpusing System;using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;public static string CreateCaptcha(int width, int height, int fontSize) {string code = string.Empty;Random random = new Random();Graphics g = Graphics.FromImage(new Bitmap(width, height));g.Clear(Color.White);Font font = new Font("Arial", fontSize, FontStyle.Bold);string[] chars = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };for (int i = 0; i < 4; i++){int index = random.Next(chars.Length);string charCode = chars[index];code += charCode;g.DrawString(charCode, font, Brushes.Black, new PointF(i (fontSize + 2), 0));}g.DrawLine(Pen.Black, new PointF(0, 0), new PointF(width, 0));g.DrawLine(Pen.Black, new PointF(0, 0), new PointF(0, height));g.DrawLine(Pen.Black, new PointF(width, 0), new PointF(width, height));g.DrawLine(Pen.Black, new PointF(0, height), new PointF(width, height));g.Dispose();return code;}public static bool ValidateCaptcha(string inputCaptcha, string storedCaptcha){return inputCaptcha.Equals(storedCaptcha,StringComparison.OrdinalIgnoreCase);}```4. 系统测试(1)注册功能测试:输入正确的用户名、密码、邮箱,注册成功。

基于C#对用户密码使用MD5加密与解密

基于C#对⽤户密码使⽤MD5加密与解密C#中常涉及到对⽤户密码的加密于解密的算法,其中使⽤MD5加密是最常见的的实现⽅式。

本⽂总结了通⽤的算法并结合了⾃⼰的⼀点⼩经验,分享给⼤家。

⼀.使⽤16位、32位、64位MD5⽅法对⽤户名加密1)16位的MD5加密/// <summary>/// 16位MD5加密/// </summary>/// <param name="password"></param>/// <returns></returns>public static string MD5Encrypt16(string password){var md5 = new MD5CryptoServiceProvider();string t2 = BitConverter.ToString(puteHash(Encoding.Default.GetBytes(password)), 4, 8);t2 = t2.Replace("-", "");return t2;}2)32位的MD5加密/// <summary>/// 32位MD5加密/// </summary>/// <param name="password"></param>/// <returns></returns>public static string MD5Encrypt32(string password){string cl = password;string pwd = "";MD5 md5 = MD5.Create(); //实例化⼀个md5对像// 加密后是⼀个字节类型的数组,这⾥要注意编码UTF8/Unicode等的选择 byte[] s = puteHash(Encoding.UTF8.GetBytes(cl));// 通过使⽤循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得for (int i = 0; i < s.Length; i++){// 将得到的字符串使⽤⼗六进制类型格式。

基于MD5与RSA算法的数字认证研究与实现

基于MD5与RSA算法的数字认证研究与实现廖莎莎【摘要】分析数字认证技术,结合基于MD5和RSA算法的安全认证体制,给出详细的实现方法与测试结果,为网络信息安全提供了一套实用的参考方案.【期刊名称】《黄山学院学报》【年(卷),期】2010(012)005【总页数】3页(P80-82)【关键词】信息安全;MD5;RSA;数字认证【作者】廖莎莎【作者单位】黄山学院,现代教育技术中心,安徽,黄山,245041【正文语种】中文【中图分类】TP3912000年6月,美国国会在“全球和国家商务法(ESIGN法)”中批准了电子签名。

这一立法避免了对仅仅基于电子形式的合同或者签名的争论,从而赋予电子签名以新的合法性。

2005年4月1日《电子签名法》在我国开始正式实施,这部法律规定,可靠的电子签名与手写签名或盖章具有同等的法律效力。

[1]电子签名技术有很多种,但目前比较成熟以及普遍被使用的电子签名技术是基于MD5与RSA算法数字签名技术。

MD5算法可以简要的描述为MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这4个32位分组串联后将生成一个128位散列值。

[2]MD5算法步骤:首先要计算分片信息,计算具体过程如下:第二、三、四轮分别使用GG(a,b,c,d,M[i],s,ti),HH(a,b,c,d,M[i],s,ti)和II(a,b,c,d,M[i],s,ti),其中i自增。

6.每执行完上述四轮一次后,执行下面运算7.对每个GroupContest[i]重复5,6操作,直到N+1个GroupContest[i]都完成,最终输出128位字符串ABCD作为数字指纹。

尽管公钥加密算法的种类有很多,但RSA对目前为止已知的所有密码攻击几乎都具备抵抗力。

RSA算法的安全性基于分解大整数的困难性。

计算两个大素数的乘积是容易的,但是把一个大合数分解成两个素数的积却是特别困难的。

浅谈使用MD5算法加密数据(完整版)

浅谈使用MD5算法加密用户密码一、引言最近看了媒体的一篇关于“网络上公开叫卖个人隐私信息”报导,不法分子通过非法手段获得的个人隐私信息,其详细、准确程度简直令人瞠口结舌。

在互联网飞速发展的现在,我们不难想到,网络肯定是传播这些个人隐私信息的重要途径之一。

现在网络上一般的网站,只要稍微完善一点的,都需要用户进行注册,提供诸如用户名、用户密码、电子邮件、甚至是电话号码、详细住址等个人隐私信息,然后才可以享受网站提供的一些特殊的信息或者服务。

比如电子商务网站,用户需要购买商品,就一定需要提供详细而准确的信息,而这些信息,往往都是用户的隐私信息,比如电子邮件、电话号码、详细住址等。

所以,用户注册的信息对于用户和网站来说都是很重要的资源,不能随意公开,当然也不能存在安全上的隐患。

用户注册时,如果将用户资料直接保存在数据库中,而不施加任何的保密措施,对于一些文件型数据库(如Access),如果有人得到这个数据库文件,那这些资料将全部泄露。

再有,如果遇到一个不负责任的网管,则不需要任何技术手段,他就可以查看到用户的任何资料。

所以,为了增加安全性,我们有必要对数据库中的隐私数据进行加密,这样,即使有人得到了整个数据库,如果没有解密算法,也一样不能查看到用户的隐私信息。

但是,在考虑数据库是否安全之前,有必要对这些数据是否真的那么重要进行考虑,如果数据并不重要,则没有保密的必要,否则将会浪费系统资源、加重程序负担。

反之,如果数据具有一定的隐私性,则必须进行加密。

因此,在考虑加密以前,应该对数据是否需要加密做出选择,以免浪费系统资源或者留下安全隐患。

二、MD5算法简介MD5算法,即“Message-Digest Algorithm 5(信息-摘要算法)”,它是由MD2、MD3、MD4发展而来的一种单向函数算法,也就是哈希(HASH)算法,是由国际著名的公钥加密算法标准RSA的第一设计者R.Rivest于上个世纪90年代初开发出来的。

JSP使用MD5加密进行登录验证

JSP使用MD5加密进行登录验证网络上带给我们很多便捷,同时也出现很多问题,如安全。

有时候很多网站对于用户信息没有进行加密处理,导致数据库泄露后用户的信息也被曝光,如此一来便引起用户很大的不便。

之前做过一个简单的登陆验证,现在把MD5加密加入登陆验证里面。

我的具体思路是这样的。

这里只做简单的加密验证,只对用户密码进行加密。

首先用户注册的时候在我们获取到密码明文,然后调用MD5类中getMD5()方法,此方法是将明文转化为密文的关键算法(关于MD5算法大家可以在网上查询到资料),明文经过getMD5()方法处理后函数返回密文字符串。

然后再将密文存入数据库,如此一来即使数据库被人拿到他也无法获取到用户密码,因此可以说用户安全性得到了大大的提高(如admin经过getMD5处理后得到的是21232f297a57a5a743894a0e4a801fc3)关于验证方法其实也很简单,只要围绕着密文这个关键就行,比如用户输入账号admin密码123456,但是数据库存的数据却不是123456而是他的密文,所以我们先写个方法check()校验用户正确的方法,这个方法需要传入两个参数,username和password(这两个参数就是从网页传来,用户输入的内容);首先根据用户传来的账号admin对数据库进行查找,找到admin对应的密码的密文设为X,然后把用户传来的密码根据getMD5()方法获取到期MD5码,我们需要比较的就是这个MD5码。

简单点说就是把数据库密码的密文X来和用户传来的密码的密文相比较就行了。

下面贴上关键代码:getConnection()方法的代码(获取数据库连接):public class JdbcUtil {private static final String className="com.mysql.jdbc.Driver";private static final String url="jdbc:mysql://localhost:3306/test";private static final String user="root";private static final String password="root";private static Connection conn;private static Statement st;public static Connection getConnection(){try {Class.forName(className);} catch (ClassNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}try {conn=DriverManager.getConnection(url, user, password);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return conn;}}getMD5()的代码(MD5加密):Package /doc/984597507.html, public final static String getMD5(String s) {char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','a', 'b', 'c', 'd', 'e', 'f' };try {byte[] strTemp = s.getBytes();// 使用MD5创建MessageDigest对象MessageDigest mdTemp =MessageDigest.getInstance("MD5");mdTemp.update(strTemp);byte[] md = mdTemp.digest();int j = md.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte b = md[i];//System.out.println((int)b);// 将没个数(int)b进行双字节加密str[k++] = hexDigits[b >> 4 & 0xf];str[k++] = hexDigits[b & 0xf];}return new String(str);} catch (Exception e) {return null;}}check()方法代码(校验用户登录):public boolean check(String username,String password) {// TODO Auto-generated method stub//先把得到的密码转化成MD5码用mdpass保存String mdpass=MD5.getMD5(password);String pass="";conn=JdbcUtil.getConnection();String sql="select password from admin where username='"+username+"'";try {st = (Statement) conn.createStatement(); //创建用于执行静态sql语句的Statement对象,st属局部变量ResultSet rs = st.executeQuery(sql); //执行sql查询语句,返回查询数据的结果集while (rs.next()) { // 判断是否还有下一个数据// 根据字段名获取相应的值pass=rs.getString("password");}conn.close(); //关闭数据库连接} catch (SQLException e) {System.out.println("查询数据失败");}//输出查到的值与之前MD5码比较if(pass.equals(mdpass)){return true;} elsereturn false;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档