使用MD5变换算法来防止穷举破译密码

换算|算法

MD5是在Web应用程序中最常用的密码加密算法。由于MD5是不可逆的,因而经过MD5计算得到后的密文,不能通过逆向算法得到原文。

回顾在Web应用程序中使用MD5加密文本密码的初衷,就是为了防止数据库中保存的密码不幸泄露后被直接获得。但攻击者不但拥有数据量巨大的密码字典,而且建立了很多MD5原文/密文对照数据库,能快速地找到常用密码的MD5密文,是破译MD5密文的高效途径。然而,MD5密文数据库所使用的是最常规的MD5加密算法:原文-->MD5-->密文。因此,我们可以使用变换的MD5算法,使现成的MD5密文数据库无所作为。

下面演示一些变换算法的例子,当然,在其它的Web开发语言中,也大同小异,完全能得到相同的结果。

变换一:循环MD5

最容易理解的变换就是对一个密码进行多次的MD5运算。自定义一个函数,它接受$data和$times两个形参,第一个是要加密的密码,第二个是重复加密的次数。实现这种变换有两种算法:

//迭代算法function md5_1_1($data, $times = 32){//循环使用MD5for ($i = 0; $i < $times; $i++) {$data = md5($data);}return $data;}//递归算法function md5_1_2($data, $times = 32){if ($times > 0) {$data = md5($data);$times--;return md5_1_2($data, $times); //实现递归} else {return $data;}}?>

变换二:密文分割MD5

尽管用户的密码是不确定的字符串,但是只要经过一次MD5运算后,就会得到一个由32个字符组成的字符串,这时可以再针对这个定长字符串变换。有点BT的算法是,把这段密文分割成若干段,对每段都进行一次MD5运算,然后把这堆密文连成一个超长的字符串,最后再进行一次MD5运算,得到仍然是长度为32位的密文。

//把密文分割成两段,每段16个字符function md5_2_1($data){//先把密码加密成长度为32字符的密文$data = md5($data);//把密码分割成两段$left = substr($data, 0, 16);$right = substr($data, 16, 16);//分别加密后再合并$data = md5($left).md5($right);//最后把长字串再加密一次,成为32字符密文return md5($data);}//把密文分割成32段,每段1个字符function md5_2_2($data){$data = md5($data);//循环地截取密文中的每个字符并进行加密、连接for ($i = 0; $i < 32; $i++) {$data .= md5($data{$i});}//这时$data长度为1024个字符,再进行一次MD5运算return md5($data);}?>

当然,这种密文分割的具体算法是数之不尽的,比如可以把原密文分割成16段每段两字符、8段每段4字符,或者每一段的字符数不相等……

变换三:附加字符串干涉

在加密过程的一个步骤中,附加一个内容确定的字符串(比如说用户名),干涉被加密的数据。不可以用随机字串,因为这样会使原算法无法重现。这种算法在某些情况下是很具有优势的,比如说用于大量的用户密码加密,可以把用户名作为附加干涉字串,这样攻击者就算知道你的算法,也很难从他们手中的字典中一下子生成海量的对照表,然后大量地破译用户密码,只能有针对性的穷举为数不多的用户。

//附加字符串在原数据的尾部function md5_3_1($data, $append){return md5($data.$append);}//附加字符串在原数据的头部function md5_3_2($data, $append){return md5($append.$data);}//附加字符串在原数据的头尾function md5_3_3($data, $append){return md5($append.$data.$append);}?>

变换四:大小写变换干涉

由于PHP所提供的md5()函数返回的密文中的英文字母全部都是小写的,因此我们可以把它们全部转为大写,然后再进行一次MD5运算。  

function md5_4($data){//先得到密码的密文$data = md5($data);//再把密文中的英文母全部转为大写$data = strtotime($data);//最后再进行一次MD5运算并返回return md5($data);}?>

变换五:字符串次序干涉

把MD5运算后的密文字符串的顺序调转后,再进行一次MD5运算。  

function md5_5($data){//得到数据的密文$data = md5($data);//再把密文字符串的字符顺序调转$data = strrev($data);//最后再进行一次MD5运算并返回return md5($data);}?>

变换六、变换七、变换八……

MD5变换算法是数之不尽的,甚至无须自己再去创造,就用上面的五个互相组合就可以搞出很BT的算法。比如说先循环加密后再分割,并在每一段上附加一个字符串再分别加密,然后变换大小写并颠倒字符串顺序后连成一个长字符串再进行MD5运算……

如果真的很不幸,由于某些漏洞,比如说SQL Injection或者文件系统中的数据库被下载而异致用户密码数据暴露,那么MD5变换算法就能大大地增加破译出密码原文的难度,首先就是使网上很多的MD5原文/密文对照数据库(要知道,这是破译MD5最高效的方法)没有用了,然后就是使攻击者用常规算法去穷举一串由变换算法得到的密文而搞得焦头烂额。当然,MD5变换算法特别适合用于非开源的Web程序使用,虽说用在开源的程序中优势会被削弱(大家都知道算法),但是也能抑制MD5原文/密文对照数据库的作用。要进行这些复杂的变换运算,当然就要花费的更多的系统开销了,然而对于安全性要求很严格的系统来说,多付出一些来换取高一点的安全性,是完全值得的。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索算法
, 字符串
, md5
, md5 加密解密
, data
, 变换
, input密文
, 密文
, MD5加密安全
, 配置文件 密文
, md5加密解密
, md5加密的使用
, md5加盐
页面调转
md5穷举、md5破译、md5 防止作弊、穷举法、穷举法破解密码,以便于您获取更多的相关知识。

时间: 2024-09-18 01:28:47

使用MD5变换算法来防止穷举破译密码的相关文章

C++基本算法思想之穷举法_C 语言

穷举算法(Exhaustive Attack method)是最简单的一种算法,其依赖于计算机的强大计算能力来穷尽每一种可能性,从而达到求解问题的目的.穷举算法效率不高,但是适应于一些没有规律可循的场合. 穷举算法基本思想穷举算法的基本思想就是从所有可能的情况中搜索正确的答案,其执行步骤如下: (1)对于一种可能的情况,计算其结果. (2)判断结果是否符合要求,如果不满足则执行第(1)步来搜索下一个可能的情况:如果符合要求,则表示寻找到一个正确答案. 在使用穷举法时,需要明确问题的答案的范围,这

PHP经典题:百钱百鸡问题(穷举算法)

PHP经典题:百钱百鸡问题(穷举算法)

使用MD5变换算法防穷举(冲撞)破译密码

换算|算法     MD5是在Web应用程序中最常用的密码加密算法.由于MD5是不可逆的,因而经过MD5计算得到后的密文,不能通过逆向算法得到原文. 回顾在Web应用程序中使用MD5加密文本密码的初衷,就是为了防止数据库中保存的密码不幸泄露后被直接获得.但攻击者不但拥有数据量巨大的密码字典,而且建立了很多MD5原文/密文对照数据库,能快速地找到常用密码的MD5密文,是破译MD5密文的高效途径.然而,MD5密文数据库所使用的是最常规的MD5加密算法:原文-->MD5-->密文.因此,我们可以使用

算法系列(十六) 使用穷举法解猜结果游戏

一. 引言 穷举是解决问题的一种常用思路,当对一个问题无从下手的时候,可以考虑在问题 域允许的范围内将所有可能的结果穷举出来,然后根据正确结果的判断规则对这些结果逐个验证,从而找 出正确的结果.采用穷举的方法求解问题的答案比较适合计算机做,对这种体力活它们没有怨言,本文就 以常见的两个猜结果的题目为例,介绍一下如何通过计算机程序解决此类问题,顺便介绍一下穷举法常见 的算法结构和实现方式. 二. 猜结果游戏的分析过程 先来看一个问题,有五个运动员 (甲.乙.丙.丁.戊)参加运动会,分别获得了一百米

递归-最蠢数独穷举算法,就是不出结果,求解

问题描述 最蠢数独穷举算法,就是不出结果,求解 用C++/C写了个数独暴力破解算法,运用递归来破解数独 搞了半天不知道错哪..求前辈指教.. PS:数独就是9×9=81个格子 要把9组1~9一共81个数字填入格子中 要求: 每一行不能有相同的数 每一列不能有相同的数 每一小宫(9个格子)不能有相同的数 #include <iostream> using namespace std; void Sudoku(int x,int y); //放数 int Judge(int x,int y,int

穷举密码算法

//*******************************************************************//在许多情况下我们需要穷举组合的算法,比如密码词典.//这个算法的关键是密码下标进位的问题.//另外本例子中的写文件语句效率比较低,为了降低算法复杂度没有优化.//如果要提高写文件的效率,可以使用缓冲区,分批写入.//*********************************************breath.cnpick.com***** voi

请教一个穷举的算法:)列出字符串

问题描述 问题描述:现在想从ABCD四个字符想穷举后得到:ABCDAAABACADAAAAABAACAADABAABBABCABDACAACBACCACDADAADBADCADD.....DDDDD等等,不计各个位数,但最长的长度为5即DDDDD,求出各种字符组合.请教高手指点:) 解决方案 解决方案二:四进制!!!代码就不用写了吧解决方案三:请问要怎么做四进制呢?还有要是如果字符更多,穷举的长度也变长呢?请教:)解决方案四:又是一个全排列问题.解决方案五:楼上的有好招么?请教:)解决方案六:[

JavaScript实现穷举排列(permutation)算法谜题解答_javascript技巧

谜题 穷举一个数组中各个元素的排列 策略 减而治之.递归 JavaScript解 复制代码 代码如下: /**  * Created by cshao on 12/23/14.  */ function getPermutation(arr) {   if (arr.length == 1) {     return [arr];   }   var permutation = [];   for (var i=0; i<arr.length; i++) {     var firstEle =

穷举法解24点游戏

24点游戏: 输入:n1,n2,n3,n4 输出:若能通过+ - * / 和括号混合运算,得到运算结果为24,则输出一个对应的运算表达式 穷举法: 对4个数字全排列有4!=24种排列. 4个数字共需要3个运算符,同一个运算符可以重复出现,则有4x4x4=64种情况. 对于4个数字而言,共有以下5中加括号的方式: (A(B(CD))),(A((BC)D)),((AB)(CD)),((A(BC))D),(((AB)C)D). 所以遍历的表达式最多有24*64*5=7680种.即使采用逆波兰表达式,总