【编程开发】MD5算法原理

时间:2021-08-23 10:53:52

MD5(单向散列算法)的全称是Message-Digest
Algorithm 5(信息-摘要算法),经MD2、MD3和MD4发展而来。MD5算法的使用不需要支付任何版权费用。



    MD5功能:

    输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);

    不同的输入得到的不同的结果(唯一性);

    根据128位的输出结果不可能反推出输入的信息(不可逆); 



    MD5属不属于加密算法:

    认为不属于的人是因为他们觉得不能从密文(散列值)反过来得到原文,即没有解密算法,所以这部分人认为MD5只能属于算法,不能称为加密算法;

    认为属于的人是因为他们觉得经过MD5处理后看不到原文,即已经将原文加密,所以认为MD5属于加密算法;我个人支持后者。



    MD5用途:

    1、防止被篡改:

    1)比如发送一个电子文档,发送前,我先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b一样就代表中途未被篡改。2)比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。3)SVN在检测文件是否在CheckOut后被修改过,也是用到了MD5.



    2、防止直接看到明文:

    现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码(其实这样是不安全的,后面我会提到)。(比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。)



    3、防止抵赖(数字签名):

    这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。



    MD5算法过程:

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



     第一步、填充:如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和n个0。填充完后,信息的长度就为N*512+448(bit);



     第二步、记录信息长度:用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N*512+448+64=(N+1)*512位。



     第三步、装入标准的幻数(四个整数):标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定义应该是(A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)。有点晕哈,其实想一想就明白了。



     第四步、四轮循环运算:循环的次数是分组的个数(N+1) 



     1)将每一512字节细分成16个小组,每个小组64位(8个字节)

     

     2)先认识四个线性函数(&是与,|是或,~是非,^是异或)

  F(X,Y,Z)=(X&Y)|((~X)&Z)

  G(X,Y,Z)=(X&Z)|(Y&(~Z))

  H(X,Y,Z)=X^Y^Z

  I(X,Y,Z)=Y^(X|(~Z))

3)设Mj表示消息的第j个子分组(从0到15),<<<s表示循环左移s位,则四种操作为:

  FF(a,b,c,d,Mj,s,ti)表示a=b+((a+F(b,c,d)+Mj+ti)<<<s)

  GG(a,b,c,d,Mj,s,ti)表示a=b+((a+G(b,c,d)+Mj+ti)<<<s)

  HH(a,b,c,d,Mj,s,ti)表示a=b+((a+H(b,c,d)+Mj+ti)<<<s)

  II(a,b,c,d,Mj,s,ti)表示a=b+((a+I(b,c,d)+Mj+ti)<<<s)

4)四轮运算

第一轮

a,0xd76aa478)

b,0xe8c7b756)

c,0x242070db)

d,0xc1bdceee)

a,0xf57c0faf)

b,0x4787c62a)

c,0xa8304613)

d,0xfd469501)

a,0x698098d8)

b,0x8b44f7af)

c,0xffff5bb1)

d,0x895cd7be)

a,0x6b901122)

b,0xfd987193)

c,0xa679438e)

d,0x49b40821)



第二轮

a,0xf61e2562)

b,0xc040b340)

c,0x265e5a51)

d,0xe9b6c7aa)

a,0xd62f105d)

b,0x02441453)

c,0xd8a1e681)

d,0xe7d3fbc8)

a,0x21e1cde6)

b,0xc33707d6)

c,0xf4d50d87)

d,0x455a14ed)

a,0xa9e3e905)

b,0xfcefa3f8)

c,0x676f02d9)

d,0x8d2a4c8a)



第三轮

a,0xfffa3942)

b,0x8771f681)

c,0x6d9d6122)

d,0xfde5380c)

a,0xa4beea44)

b,0x4bdecfa9)

c,0xf6bb4b60)

d,0xbebfbc70)

a,0x289b7ec6)

b,0xeaa127fa)

c,0xd4ef3085)

d,0x04881d05)

a,0xd9d4d039)

b,0xe6db99e5)

c,0x1fa27cf8)

d,0xc4ac5665)



第四轮

a,0xf4292244)

b,0x432aff97)

c,0xab9423a7)

d,0xfc93a039)

a,0x655b59c3)

b,0x8f0ccc92)

c,0xffeff47d)

d,0x85845dd1)

a,0x6fa87e4f)

b,0xfe2ce6e0)

c,0xa3014314)

d,0x4e0811a1)

a,0xf7537e82)

b,0xbd3af235)

c,0x2ad7d2bb)

d,0xeb86d391)

5)每轮循环后,将A,B,C,D分别加上a,b,c,d,然后进入下一循环。

 

    如果上面的过程用JAVA代码来实现的话,代码如下:

【编程开发】MD5算法原理package woxingwosu;

【编程开发】MD5算法原理

【编程开发】MD5算法原理

【编程开发】MD5算法原理/************************************************

【编程开发】MD5算法原理 * MD5 算法

【编程开发】MD5算法原理 * @author 我行我素

【编程开发】MD5算法原理 * @Date 2007-07-01

【编程开发】MD5算法原理*************************************************/

【编程开发】MD5算法原理public class MD5 {

【编程开发】MD5算法原理

【编程开发】MD5算法原理    ","A","B","C","D","E","F"};

【编程开发】MD5算法原理    //标准的幻数

【编程开发】MD5算法原理    private static final long A=0x67452301L;

【编程开发】MD5算法原理    private static final long B=0xefcdab89L;

【编程开发】MD5算法原理    private static final long C=0x98badcfeL;

【编程开发】MD5算法原理    private static final long D=0x10325476L;

【编程开发】MD5算法原理

【编程开发】MD5算法原理    

【编程开发】MD5算法原理    //下面这些S11-S44实际上是一个4*4的矩阵,在四轮循环运算中用到

【编程开发】MD5算法原理;

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理    ;

【编程开发】MD5算法原理    

【编程开发】MD5算法原理    //java不支持无符号的基本数据(unsigned)

【编程开发】MD5算法原理    private long [] result={A,B,C,D};//存储hash结果,共4×32=128位,初始化值为(幻数的级联)

【编程开发】MD5算法原理    

【编程开发】MD5算法原理    public static void main(String []args){

【编程开发】MD5算法原理        MD5 md=new MD5();

【编程开发】MD5算法原理        System.out.println("md5(abc)="+md.digest("abc"));

【编程开发】MD5算法原理    }

【编程开发】MD5算法原理    

【编程开发】MD5算法原理    private String digest(String inputStr){

【编程开发】MD5算法原理        byte [] inputBytes=inputStr.getBytes();

【编程开发】MD5算法原理        int byteLen=inputBytes.length;//长度(字节)

【编程开发】MD5算法原理;//完整分组的个数

【编程开发】MD5算法原理;//每组512位(64字节)

【编程开发】MD5算法原理        long []groups=null;//每个小组(64字节)再细分后的16个小组(4字节)

【编程开发】MD5算法原理        

【编程开发】MD5算法原理        //处理每一个完整 分组

【编程开发】MD5算法原理;step<groupCount;step++){

【编程开发】MD5算法原理            groups);

【编程开发】MD5算法原理            trans(groups);//处理分组,核心算法

【编程开发】MD5算法原理        }

【编程开发】MD5算法原理        

【编程开发】MD5算法原理        //处理完整分组后的尾巴

【编程开发】MD5算法原理;//512位分组后的余数

【编程开发】MD5算法原理];

【编程开发】MD5算法原理        ){

【编程开发】MD5算法原理            ;i<rest;i++)

【编程开发】MD5算法原理                tempBytes[i]=inputBytes[byteLen-rest+i];

【编程开发】MD5算法原理            ){

【编程开发】MD5算法原理                tempBytes[rest]);

【编程开发】MD5算法原理                -rest;i++)

【编程开发】MD5算法原理                    tempBytes[rest;

【编程开发】MD5算法原理            }

【编程开发】MD5算法原理            );

【编程开发】MD5算法原理            ;i++){

【编程开发】MD5算法原理                tempBytes[+i]=(byte)(len&0xFFL);

【编程开发】MD5算法原理                len;

【编程开发】MD5算法原理            }

【编程开发】MD5算法原理            groups);

【编程开发】MD5算法原理            trans(groups);//处理分组

【编程开发】MD5算法原理        }else{

【编程开发】MD5算法原理            ;i<rest;i++)

【编程开发】MD5算法原理                tempBytes[i]=inputBytes[byteLen-rest+i];

【编程开发】MD5算法原理            tempBytes[rest]);

【编程开发】MD5算法原理            ;i++)

【编程开发】MD5算法原理                tempBytes[i];

【编程开发】MD5算法原理            groups);

【编程开发】MD5算法原理            trans(groups);//处理分组

【编程开发】MD5算法原理            

【编程开发】MD5算法原理            ;i++)

【编程开发】MD5算法原理                tempBytes[i];

【编程开发】MD5算法原理            );

【编程开发】MD5算法原理            ;i++){

【编程开发】MD5算法原理                tempBytes[+i]=(byte)(len&0xFFL);

【编程开发】MD5算法原理                len;

【编程开发】MD5算法原理            }

【编程开发】MD5算法原理            groups);

【编程开发】MD5算法原理            trans(groups);//处理分组

【编程开发】MD5算法原理        }

【编程开发】MD5算法原理        

【编程开发】MD5算法原理        //将Hash值转换成十六进制的字符串

【编程开发】MD5算法原理        String resStr="";

【编程开发】MD5算法原理        ;

【编程开发】MD5算法原理        ;i++){

【编程开发】MD5算法原理            ;j++){

【编程开发】MD5算法原理                temp=result[i]&0x0FL;

【编程开发】MD5算法原理                String a=hexs[(int)(temp)];

【编程开发】MD5算法原理                result[i];

【编程开发】MD5算法原理                temp=result[i]&0x0FL;

【编程开发】MD5算法原理                resStr+=hexs[(int)(temp)]+a;

【编程开发】MD5算法原理                result[i];

【编程开发】MD5算法原理            }

【编程开发】MD5算法原理        }

【编程开发】MD5算法原理        return resStr;

【编程开发】MD5算法原理    }

【编程开发】MD5算法原理    

【编程开发】MD5算法原理    /**

【编程开发】MD5算法原理     * 从inputBytes的index开始取512位,作为新的分组

【编程开发】MD5算法原理     * 将每一个512位的分组再细分成16个小组,每个小组64位(8个字节)

【编程开发】MD5算法原理     * @param inputBytes

【编程开发】MD5算法原理     * @param index

【编程开发】MD5算法原理     * @return

【编程开发】MD5算法原理     */

【编程开发】MD5算法原理    private static long[] divGroup(byte[] inputBytes,int index){

【编程开发】MD5算法原理        ];

【编程开发】MD5算法原理        ;i++){

【编程开发】MD5算法原理            temp[i]*i+index])|

【编程开发】MD5算法原理                (b2iu(inputBytes[|

【编程开发】MD5算法原理                (b2iu(inputBytes[|

【编程开发】MD5算法原理                (b2iu(inputBytes[;

【编程开发】MD5算法原理        }

【编程开发】MD5算法原理        return temp;

【编程开发】MD5算法原理    }

【编程开发】MD5算法原理    

【编程开发】MD5算法原理    /**

【编程开发】MD5算法原理     * 这时不存在符号位(符号位存储不再是代表正负),所以需要处理一下

【编程开发】MD5算法原理     * @param b

【编程开发】MD5算法原理     * @return

【编程开发】MD5算法原理     */

【编程开发】MD5算法原理    public static long b2iu(byte b){

【编程开发】MD5算法原理         : b;

【编程开发】MD5算法原理     }

【编程开发】MD5算法原理    

【编程开发】MD5算法原理    /**

【编程开发】MD5算法原理     * 主要的操作,四轮循环

【编程开发】MD5算法原理     * @param groups[]--每一个分组512位(64字节)

【编程开发】MD5算法原理     */

【编程开发】MD5算法原理    private void trans(long[] groups) {

【编程开发】MD5算法原理        ];

【编程开发】MD5算法原理        /*第一轮*/

【编程开发】MD5算法原理        a ], S11, 0xd76aa478L); /* 1 */

【编程开发】MD5算法原理        d ], S12, 0xe8c7b756L); /* 2 */

【编程开发】MD5算法原理        c ], S13, 0x242070dbL); /* 3 */

【编程开发】MD5算法原理        b ], S14, 0xc1bdceeeL); /* 4 */

【编程开发】MD5算法原理        a ], S11, 0xf57c0fafL); /* 5 */

【编程开发】MD5算法原理        d ], S12, 0x4787c62aL); /* 6 */

【编程开发】MD5算法原理        c ], S13, 0xa8304613L); /* 7 */

【编程开发】MD5算法原理        b ], S14, 0xfd469501L); /* 8 */

【编程开发】MD5算法原理        a ], S11, 0x698098d8L); /* 9 */

【编程开发】MD5算法原理        d ], S12, 0x8b44f7afL); /* 10 */

【编程开发】MD5算法原理        c ], S13, 0xffff5bb1L); /* 11 */

【编程开发】MD5算法原理        b ], S14, 0x895cd7beL); /* 12 */

【编程开发】MD5算法原理        a ], S11, 0x6b901122L); /* 13 */

【编程开发】MD5算法原理        d ], S12, 0xfd987193L); /* 14 */

【编程开发】MD5算法原理        c ], S13, 0xa679438eL); /* 15 */

【编程开发】MD5算法原理        b ], S14, 0x49b40821L); /* 16 */

【编程开发】MD5算法原理

【编程开发】MD5算法原理        /*第二轮*/

【编程开发】MD5算法原理        a ], S21, 0xf61e2562L); /* 17 */

【编程开发】MD5算法原理        d ], S22, 0xc040b340L); /* 18 */

【编程开发】MD5算法原理        c ], S23, 0x265e5a51L); /* 19 */

【编程开发】MD5算法原理        b ], S24, 0xe9b6c7aaL); /* 20 */

【编程开发】MD5算法原理        a ], S21, 0xd62f105dL); /* 21 */

【编程开发】MD5算法原理        d ], S22, 0x2441453L); /* 22 */

【编程开发】MD5算法原理        c ], S23, 0xd8a1e681L); /* 23 */

【编程开发】MD5算法原理        b ], S24, 0xe7d3fbc8L); /* 24 */

【编程开发】MD5算法原理        a ], S21, 0x21e1cde6L); /* 25 */

【编程开发】MD5算法原理        d ], S22, 0xc33707d6L); /* 26 */

【编程开发】MD5算法原理        c ], S23, 0xf4d50d87L); /* 27 */

【编程开发】MD5算法原理        b ], S24, 0x455a14edL); /* 28 */

【编程开发】MD5算法原理        a ], S21, 0xa9e3e905L); /* 29 */

【编程开发】MD5算法原理        d ], S22, 0xfcefa3f8L); /* 30 */

【编程开发】MD5算法原理        c ], S23, 0x676f02d9L); /* 31 */

【编程开发】MD5算法原理        b ], S24, 0x8d2a4c8aL); /* 32 */

【编程开发】MD5算法原理

【编程开发】MD5算法原理        /*第三轮*/

【编程开发】MD5算法原理        a ], S31, 0xfffa3942L); /* 33 */

【编程开发】MD5算法原理        d ], S32, 0x8771f681L); /* 34 */

【编程开发】MD5算法原理        c ], S33, 0x6d9d6122L); /* 35 */

【编程开发】MD5算法原理        b ], S34, 0xfde5380cL); /* 36 */

【编程开发】MD5算法原理        a ], S31, 0xa4beea44L); /* 37 */

【编程开发】MD5算法原理        d ], S32, 0x4bdecfa9L); /* 38 */

【编程开发】MD5算法原理        c ], S33, 0xf6bb4b60L); /* 39 */

【编程开发】MD5算法原理        b ], S34, 0xbebfbc70L); /* 40 */

【编程开发】MD5算法原理        a ], S31, 0x289b7ec6L); /* 41 */

【编程开发】MD5算法原理        d ], S32, 0xeaa127faL); /* 42 */

【编程开发】MD5算法原理        c ], S33, 0xd4ef3085L); /* 43 */

【编程开发】MD5算法原理        b ], S34, 0x4881d05L); /* 44 */

【编程开发】MD5算法原理        a ], S31, 0xd9d4d039L); /* 45 */

【编程开发】MD5算法原理        d ], S32, 0xe6db99e5L); /* 46 */

【编程开发】MD5算法原理        c ], S33, 0x1fa27cf8L); /* 47 */

【编程开发】MD5算法原理        b ], S34, 0xc4ac5665L); /* 48 */

【编程开发】MD5算法原理

【编程开发】MD5算法原理        /*第四轮*/

【编程开发】MD5算法原理        a ], S41, 0xf4292244L); /* 49 */

【编程开发】MD5算法原理        d ], S42, 0x432aff97L); /* 50 */

【编程开发】MD5算法原理        c ], S43, 0xab9423a7L); /* 51 */

【编程开发】MD5算法原理        b ], S44, 0xfc93a039L); /* 52 */

【编程开发】MD5算法原理        a ], S41, 0x655b59c3L); /* 53 */

【编程开发】MD5算法原理        d ], S42, 0x8f0ccc92L); /* 54 */

【编程开发】MD5算法原理        c ], S43, 0xffeff47dL); /* 55 */

【编程开发】MD5算法原理        b ], S44, 0x85845dd1L); /* 56 */

【编程开发】MD5算法原理        a ], S41, 0x6fa87e4fL); /* 57 */

【编程开发】MD5算法原理        d ], S42, 0xfe2ce6e0L); /* 58 */

【编程开发】MD5算法原理        c ], S43, 0xa3014314L); /* 59 */

【编程开发】MD5算法原理        b ], S44, 0x4e0811a1L); /* 60 */

【编程开发】MD5算法原理        a ], S41, 0xf7537e82L); /* 61 */

【编程开发】MD5算法原理        d ], S42, 0xbd3af235L); /* 62 */

【编程开发】MD5算法原理        c ], S43, 0x2ad7d2bbL); /* 63 */

【编程开发】MD5算法原理        b ], S44, 0xeb86d391L); /* 64 */

【编程开发】MD5算法原理

【编程开发】MD5算法原理        /*加入到之前计算的结果当中*/

【编程开发】MD5算法原理        result[] += a;

【编程开发】MD5算法原理        result[] += b;

【编程开发】MD5算法原理        result[] += c;

【编程开发】MD5算法原理        result[] += d;

【编程开发】MD5算法原理        result[]&0xFFFFFFFFL;

【编程开发】MD5算法原理        result[]&0xFFFFFFFFL;

【编程开发】MD5算法原理        result[]&0xFFFFFFFFL;

【编程开发】MD5算法原理        result[]&0xFFFFFFFFL;

【编程开发】MD5算法原理    }

【编程开发】MD5算法原理    

【编程开发】MD5算法原理    /**

【编程开发】MD5算法原理     * 下面是处理要用到的线性函数

【编程开发】MD5算法原理     */

【编程开发】MD5算法原理    private static long F(long x, long y, long z) {

【编程开发】MD5算法原理        return (x & y) | ((~x) & z);

【编程开发】MD5算法原理    }

【编程开发】MD5算法原理

【编程开发】MD5算法原理    private static long G(long x, long y, long z) {

【编程开发】MD5算法原理        return (x & z) | (y & (~z));

【编程开发】MD5算法原理    }

【编程开发】MD5算法原理

【编程开发】MD5算法原理    private static long H(long x, long y, long z) {

【编程开发】MD5算法原理        return x ^ y ^ z;

【编程开发】MD5算法原理    }

【编程开发】MD5算法原理

【编程开发】MD5算法原理    private static long I(long x, long y, long z) {

【编程开发】MD5算法原理        return y ^ (x | (~z));

【编程开发】MD5算法原理    }

【编程开发】MD5算法原理

【编程开发】MD5算法原理    private static long FF(long a, long b, long c, long d, long x, long s,

【编程开发】MD5算法原理            long ac) {

【编程开发】MD5算法原理        a += (F(b, c, d)&0xFFFFFFFFL) + x + ac;

【编程开发】MD5算法原理        a  - s));

【编程开发】MD5算法原理        a += b;

【编程开发】MD5算法原理        return (a&0xFFFFFFFFL);

【编程开发】MD5算法原理    }

【编程开发】MD5算法原理

【编程开发】MD5算法原理    private static long GG(long a, long b, long c, long d, long x, long s,

【编程开发】MD5算法原理            long ac) {

【编程开发】MD5算法原理        a += (G(b, c, d)&0xFFFFFFFFL) + x + ac;

【编程开发】MD5算法原理        a  - s));

【编程开发】MD5算法原理        a += b;

【编程开发】MD5算法原理        return (a&0xFFFFFFFFL);

【编程开发】MD5算法原理    }

【编程开发】MD5算法原理

【编程开发】MD5算法原理    private static long HH(long a, long b, long c, long d, long x, long s,

【编程开发】MD5算法原理            long ac) {

【编程开发】MD5算法原理        a += (H(b, c, d)&0xFFFFFFFFL) + x + ac;

【编程开发】MD5算法原理        a  - s));

【编程开发】MD5算法原理        a += b;

【编程开发】MD5算法原理        return (a&0xFFFFFFFFL);

【编程开发】MD5算法原理    }

【编程开发】MD5算法原理

【编程开发】MD5算法原理    private static long II(long a, long b, long c, long d, long x, long s,

【编程开发】MD5算法原理            long ac) {

【编程开发】MD5算法原理        a += (I(b, c, d)&0xFFFFFFFFL) + x + ac;

【编程开发】MD5算法原理        a  - s));

【编程开发】MD5算法原理        a += b;

【编程开发】MD5算法原理        return (a&0xFFFFFFFFL);

【编程开发】MD5算法原理    }

【编程开发】MD5算法原理}

【编程开发】MD5算法原理

MD5安全性:

    普遍认为MD5是很安全,因为暴力破解的时间是一般人无法接受的。实际上如果把用户的密码MD5处理后再存储到数据库,其实是很不安全的。因为用户的密码是比较短的,而且很多用户的密码都使用生日,手机号码,身份证号码,电话号码等等。或者使用常用的一些吉利的数字,或者某个英文单词。如果我把常用的密码先MD5处理,把数据存储起来,然后再跟你的MD5结果匹配,这时我就有可能得到明文。比如某个MD5破解网站http://www.cmd5.com/default.aspx,我把其网站下的公告复制如下

  md5破解、动网论坛密码破解等不再需要用穷举法,本站共有md5记录235亿条,还在不断增长中,已包含10位及10位以下数字、7位字母、部分7位字母+数字,全部6位及以下字母加数字等组合,并针对国内用户做了大量优化,例如已经包含所有手机号码、全国部分大中城市固定电话号码、百家姓、常用拼音等大量组合,另加入了某大型网站真实会员密码数据10万条。本站数据量大,查询速度快,同时支持16位及32位密码查询。通过对10万会员的真实动网论坛样本数据的测试,本站对于动网论坛密码的命中率达到83%。

  本站4T的硬盘已经上线,正在生成数据,预计需要2个月左右时间,到时候本站能查询到12位数字和9位字母。

你可以用你的生日,手机号码去测试一下。

   我觉得只需要将上面我写的MD5的标准幻数A,B,C,D的值修改一下,修改后也不是MD5算法了,因为不能保证唯一性。这样就算别人得到32位的值,他如果不知道幻数的值是无法还原明文的。就算得到了幻数,也是很难破解的。



     JAVA实现MD5

    在java中实现MD5是很简单的,在包java.security有个类MessageDigest。官方文档如下

    MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。 



    MessageDigest 对象开始被初始化。该对象通过使用 update 方法处理数据。任何时候都可以调用 reset 方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest 方法之一完成哈希计算。 



    对于给定数量的更新数据,digest 方法只能被调用一次。digest 被调用后,MessageDigest 对象被重新设置成其初始状态。

使用MessageDigest很简单,例如

【编程开发】MD5算法原理package woxingwosu;

【编程开发】MD5算法原理/************************************************

【编程开发】MD5算法原理 * MD5 算法

【编程开发】MD5算法原理 * @author 我行我素

【编程开发】MD5算法原理 * @Date 2007-07-06

【编程开发】MD5算法原理*************************************************/

【编程开发】MD5算法原理import java.security.MessageDigest;

【编程开发】MD5算法原理

【编程开发】MD5算法原理public class MyMD5 {

【编程开发】MD5算法原理

【编程开发】MD5算法原理    ','A','B','C','D','E','F'}; 

【编程开发】MD5算法原理    public static void main(String[] args) {

【编程开发】MD5算法原理        try{

【编程开发】MD5算法原理            MessageDigest md5 = MessageDigest.getInstance("MD5");//申明使用MD5算法

【编程开发】MD5算法原理            md5.update("a".getBytes());//

【编程开发】MD5算法原理            System.out.println("md5(a)="+byte2str(md5.digest()));

【编程开发】MD5算法原理            md5.update("a".getBytes());

【编程开发】MD5算法原理            md5.update("bc".getBytes());

【编程开发】MD5算法原理            System.out.println("md5(abc)="+byte2str(md5.digest()));

【编程开发】MD5算法原理        }catch(Exception e){

【编程开发】MD5算法原理            e.printStackTrace();

【编程开发】MD5算法原理        }

【编程开发】MD5算法原理    }

【编程开发】MD5算法原理    

【编程开发】MD5算法原理    /**

【编程开发】MD5算法原理     * 将字节数组转换成十六进制字符串

【编程开发】MD5算法原理     * @param bytes

【编程开发】MD5算法原理     * @return

【编程开发】MD5算法原理     */

【编程开发】MD5算法原理    private static String byte2str(byte []bytes){

【编程开发】MD5算法原理        int len = bytes.length;   

【编程开发】MD5算法原理        StringBuffer result = new StringBuffer();    

【编程开发】MD5算法原理        ; i < len; i++) {   

【编程开发】MD5算法原理            byte byte0 = bytes[i];   

【编程开发】MD5算法原理            result.append(hex[byte0  & 0xf]);   

【编程开发】MD5算法原理            result.append(hex[byte0 & 0xf]);   

【编程开发】MD5算法原理        }

【编程开发】MD5算法原理        return result.toString();

【编程开发】MD5算法原理    }

【编程开发】MD5算法原理

【编程开发】MD5算法原理

另外附上其他版本的MD5算法的实现(来自网络)

    1)JS版的MD5(调用方法:md5(明文))

【编程开发】MD5算法原理/*

【编程开发】MD5算法原理 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message

【编程开发】MD5算法原理 * Digest Algorithm, as defined in RFC 1321.

【编程开发】MD5算法原理 * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.

【编程开发】MD5算法原理 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet

【编程开发】MD5算法原理 * Distributed under the BSD License

【编程开发】MD5算法原理 * See http://pajhome.org.uk/crypt/md5 for more info.

【编程开发】MD5算法原理 */

【编程开发】MD5算法原理

【编程开发】MD5算法原理/*

【编程开发】MD5算法原理 * Configurable variables. You may need to tweak these to be compatible with

【编程开发】MD5算法原理 * the server-side, but the defaults work in most cases.

【编程开发】MD5算法原理 */

【编程开发】MD5算法原理;  /* hex output format. 0 - lowercase; 1 - uppercase        */

【编程开发】MD5算法原理var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */

【编程开发】MD5算法原理;  /* bits per input character. 8 - ASCII; 16 - Unicode      */

【编程开发】MD5算法原理

【编程开发】MD5算法原理/*

【编程开发】MD5算法原理 * These are the functions you'll usually want to call

【编程开发】MD5算法原理 * They take string arguments and return either hex or base-64 encoded strings

【编程开发】MD5算法原理 */

【编程开发】MD5算法原理function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}

【编程开发】MD5算法原理function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}

【编程开发】MD5算法原理function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }

【编程开发】MD5算法原理function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }

【编程开发】MD5算法原理

【编程开发】MD5算法原理/*

【编程开发】MD5算法原理 * Calculate the MD5 of an array of little-endian words, and a bit length

【编程开发】MD5算法原理 */

【编程开发】MD5算法原理function core_md5(x, len)

【编程开发】MD5算法原理{

【编程开发】MD5算法原理  /* append padding */

【编程开发】MD5算法原理  x[len );

【编程开发】MD5算法原理  x[(((len ] = len;

【编程开发】MD5算法原理

【编程开发】MD5算法原理  ;

【编程开发】MD5算法原理  ;

【编程开发】MD5算法原理  ;

【编程开发】MD5算法原理  ;

【编程开发】MD5算法原理

【编程开发】MD5算法原理  )

【编程开发】MD5算法原理  {

【编程开发】MD5算法原理    var olda = a;

【编程开发】MD5算法原理    var oldb = b;

【编程开发】MD5算法原理    var oldc = c;

【编程开发】MD5算法原理    var oldd = d;

【编程开发】MD5算法原理

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理    a );

【编程开发】MD5算法原理    d );

【编程开发】MD5算法原理    c );

【编程开发】MD5算法原理    b );

【编程开发】MD5算法原理

【编程开发】MD5算法原理    a = safe_add(a, olda);

【编程开发】MD5算法原理    b = safe_add(b, oldb);

【编程开发】MD5算法原理    c = safe_add(c, oldc);

【编程开发】MD5算法原理    d = safe_add(d, oldd);

【编程开发】MD5算法原理  }

【编程开发】MD5算法原理  return Array(a, b, c, d);

【编程开发】MD5算法原理

【编程开发】MD5算法原理}

【编程开发】MD5算法原理

【编程开发】MD5算法原理/*

【编程开发】MD5算法原理 * These functions implement the four basic operations the algorithm uses.

【编程开发】MD5算法原理 */

【编程开发】MD5算法原理function md5_cmn(q, a, b, x, s, t)

【编程开发】MD5算法原理{

【编程开发】MD5算法原理  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);

【编程开发】MD5算法原理}

【编程开发】MD5算法原理function md5_ff(a, b, c, d, x, s, t)

【编程开发】MD5算法原理{

【编程开发】MD5算法原理  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);

【编程开发】MD5算法原理}

【编程开发】MD5算法原理function md5_gg(a, b, c, d, x, s, t)

【编程开发】MD5算法原理{

【编程开发】MD5算法原理  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);

【编程开发】MD5算法原理}

【编程开发】MD5算法原理function md5_hh(a, b, c, d, x, s, t)

【编程开发】MD5算法原理{

【编程开发】MD5算法原理  return md5_cmn(b ^ c ^ d, a, b, x, s, t);

【编程开发】MD5算法原理}

【编程开发】MD5算法原理function md5_ii(a, b, c, d, x, s, t)

【编程开发】MD5算法原理{

【编程开发】MD5算法原理  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);

【编程开发】MD5算法原理}

【编程开发】MD5算法原理

【编程开发】MD5算法原理/*

【编程开发】MD5算法原理 * Calculate the HMAC-MD5, of a key and some data

【编程开发】MD5算法原理 */

【编程开发】MD5算法原理function core_hmac_md5(key, data)

【编程开发】MD5算法原理{

【编程开发】MD5算法原理  var bkey = str2binl(key);

【编程开发】MD5算法原理  ) bkey = core_md5(bkey, key.length * chrsz);

【编程开发】MD5算法原理

【编程开发】MD5算法原理  );

【编程开发】MD5算法原理  ; i++)

【编程开发】MD5算法原理  {

【编程开发】MD5算法原理    ipad[i] = bkey[i] ^ 0x36363636;

【编程开发】MD5算法原理    opad[i] = bkey[i] ^ 0x5C5C5C5C;

【编程开发】MD5算法原理  }

【编程开发】MD5算法原理

【编程开发】MD5算法原理   + data.length * chrsz);

【编程开发】MD5算法原理  );

【编程开发】MD5算法原理}

【编程开发】MD5算法原理

【编程开发】MD5算法原理/*

【编程开发】MD5算法原理 * Add integers, wrapping at 2^32. This uses 16-bit operations internally

【编程开发】MD5算法原理 * to work around bugs in some JS interpreters.

【编程开发】MD5算法原理 */

【编程开发】MD5算法原理function safe_add(x, y)

【编程开发】MD5算法原理{

【编程开发】MD5算法原理  var lsw = (x & 0xFFFF) + (y & 0xFFFF);

【编程开发】MD5算法原理  );

【编程开发】MD5算法原理  ) | (lsw & 0xFFFF);

【编程开发】MD5算法原理}

【编程开发】MD5算法原理

【编程开发】MD5算法原理/*

【编程开发】MD5算法原理 * Bitwise rotate a 32-bit number to the left.

【编程开发】MD5算法原理 */

【编程开发】MD5算法原理function bit_rol(num, cnt)

【编程开发】MD5算法原理{

【编程开发】MD5算法原理   - cnt));

【编程开发】MD5算法原理}

【编程开发】MD5算法原理

【编程开发】MD5算法原理/*

【编程开发】MD5算法原理 * Convert a string to an array of little-endian words

【编程开发】MD5算法原理 * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.

【编程开发】MD5算法原理 */

【编程开发】MD5算法原理function str2binl(str)

【编程开发】MD5算法原理{

【编程开发】MD5算法原理  var bin = Array();

【编程开发】MD5算法原理  ;

【编程开发】MD5算法原理  ; i < str.length * chrsz; i += chrsz)

【编程开发】MD5算法原理    bin[i);

【编程开发】MD5算法原理  return bin;

【编程开发】MD5算法原理}

【编程开发】MD5算法原理

【编程开发】MD5算法原理/*

【编程开发】MD5算法原理 * Convert an array of little-endian words to a string

【编程开发】MD5算法原理 */

【编程开发】MD5算法原理function binl2str(bin)

【编程开发】MD5算法原理{

【编程开发】MD5算法原理  var str = "";

【编程开发】MD5算法原理  ;

【编程开发】MD5算法原理  ; i += chrsz)

【编程开发】MD5算法原理    str )) & mask);

【编程开发】MD5算法原理  return str;

【编程开发】MD5算法原理}

【编程开发】MD5算法原理

【编程开发】MD5算法原理/*

【编程开发】MD5算法原理 * Convert an array of little-endian words to a hex string.

【编程开发】MD5算法原理 */

【编程开发】MD5算法原理function binl2hex(binarray)

【编程开发】MD5算法原理{

【编程开发】MD5算法原理  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";

【编程开发】MD5算法原理  var str = "";

【编程开发】MD5算法原理  ; i++)

【编程开发】MD5算法原理  {

【编程开发】MD5算法原理    str )) & 0xF) +

【编程开发】MD5算法原理           hex_tab.charAt((binarray[i  )) & 0xF);

【编程开发】MD5算法原理  }

【编程开发】MD5算法原理  return str;

【编程开发】MD5算法原理}

【编程开发】MD5算法原理

【编程开发】MD5算法原理String.prototype.trim = function(){return this.replace(/(^s*)|(s*$)/g, "");}

【编程开发】MD5算法原理

【编程开发】MD5算法原理function md5(text) {

【编程开发】MD5算法原理    return hex_md5(text.trim());

【编程开发】MD5算法原理}