java md5,md2,md4 加密算法

来源:互联网 发布:汽车找不到导航软件 编辑:程序博客网 时间:2024/06/08 04:26
md5(信息摘要算法5)用于确保信息传输的完整一致,是计算机广泛的使用杂凑算法之一(又名摘要算法,哈希算法),主流的编程语言普遍已经有md5的实现,将数据(如字符串)运算为另外一个固定长度值,是杂凑算法的基础原理,md5的前生,md5的前身有md2,md4。

md5算法的特点:

1:压缩性:任意长度的数据,算出的md5值长度都是固定的2:容易计算:从原数据计算出md5值很容易3:抗修改性:对原数据进行任何的修改,哪怕只修改1个字节,所得到md5值都是固定的4:强抗碰撞:已知原数据和其md5值,想找到一个具有相同md5值得数据(即伪造数据)是非常困难的

消息摘要算法的分类:

1:MD(Message Digest)
2:SHA(Secure Hash Algorithm)
3:MAC(Message Authentication Code)

java.security.MessageDigest 类主要为应用提供信息摘要算法,也就是用于生成散列码,信息摘要是安全的单项哈希函数,输出固定长度的哈希值,至于具体算法我们暂时不深入!

java 提供三种实现方式:

1:JDK 2:Commons Codec 3:Bouncy Castle

jdk相信大家都有

commons Codec 是Apache家族中提供的编码解码实现,比如Base64,Hex,Md5,Phonetic and URLS等等,下载地址 最新版本1.1

将commons codec jar加入到lib中

第三种方式是bouncy castle java平台的开放轻量级加密解密包 下载地址 引入到项目中

md5 jdk方式 加密实例与验证:

package com.example.encryption;import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/** * @author xuanyouwu * @email xuanyouwu@163.com */public class Md5Test {    private static String SrcData = "xuanyouwu";    public static void log(String s) {        System.out.println("------>" + s);    }    public static void main(String[] args) throws Exception {        String encyData=md5(SrcData);        log("encyData:"+encyData);    }    private static String md5(String src) {        try {            MessageDigest md5 = MessageDigest.getInstance("MD5");            byte[] digest = md5.digest(src.getBytes());            return HexBin.encode(digest);        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        }        return "";    }}

运行结果:



jdk md5 md2以及sun md4对比

package com.example.encryption;import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import sun.security.provider.MD4;/** * @author xuanyouwu * @email xuanyouwu@163.com */public class Md5Test {    private static String SrcData = "xuanyouwu";    public static void log(String s) {        System.out.println("------>" + s);    }    public static void main(String[] args) throws Exception {        log("encyData md5:" + md5(SrcData));        log("encyData md2:" + md2(SrcData));        log("encyData md4:" + md4(SrcData));    }    private static String md5(String src) {        try {            MessageDigest md5 = MessageDigest.getInstance("MD5");            byte[] digest = md5.digest(src.getBytes());            return HexBin.encode(digest);        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        }        return "";    }    private static String md2(String src) {        try {            MessageDigest md2 = MessageDigest.getInstance("MD2");            byte[] digest = md2.digest(src.getBytes());            return HexBin.encode(digest);        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        }        return "";    }    /**     * md4 jdk 本身不提供,这里使用sun     * @param src     * @return     */    private static String md4(String src) {        try {            MessageDigest md4 = MD4.getInstance();            byte[] digest = md4.digest(src.getBytes());            return HexBin.encode(digest);        } catch (Exception e) {            e.printStackTrace();        }        return "";    }}
运行结果:

------>encyData md5:3EA5C9303C2BE83F82FFB769345BB338
------>encyData md2:2CC409A3C62177AE523AD5E410A718F4
------>encyData md4:41DDB0C4DE7DE1E4D442F9E110A51F6C

commons_codec md5与md2

commons_codec 对于md5有两种实现 md5 md2 在org.apache.commons.codec.digest.DigestUtils 类中有提供API:


package com.example.encryption;import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;import org.apache.commons.codec.binary.Hex;import org.apache.commons.codec.digest.DigestUtils;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import sun.security.provider.MD4;/** * @author xuanyouwu * @email xuanyouwu@163.com */public class Md5Test {    private static String SrcData = "xuanyouwu";    public static void log(String s) {        System.out.println("------>" + s);    }    public static void main(String[] args) throws Exception {        log("encyData cc md2:" + ccMd2(SrcData));        log("encyData cc md5:" + ccMd5(SrcData));    }    public static String ccMd5(String src) {        return Hex.encodeHexString(DigestUtils.getMd5Digest().digest(src.getBytes()));    }    public static String ccMd2(String src) {        return Hex.encodeHexString(DigestUtils.getMd2Digest().digest(src.getBytes()));    }}

Bouncy Castle md5与md4 md2

 bouncy castle  对md加密有三种实现,分别是md5 md4以及md2:
<img src="http://img.blog.csdn.net/20160514121113603?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<pre name="code" class="java">package com.example.encryption;import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;import org.apache.commons.codec.binary.Hex;import org.apache.commons.codec.digest.DigestUtils;import org.bouncycastle.crypto.digests.MD2Digest;import org.bouncycastle.crypto.digests.MD4Digest;import org.bouncycastle.crypto.digests.MD5Digest;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import sun.security.provider.MD4;/** * @author xuanyouwu * @email xuanyouwu@163.com */public class Md5Test {    private static String SrcData = "xuanyouwu";    public static void log(String s) {        System.out.println("------>" + s);    }    public static void main(String[] args) throws Exception {        log("encyData bc md2:" + bcMd2(SrcData));        log("encyData bc md4:" + bcMd4(SrcData));        log("encyData bc md5:" + bcMd5(SrcData));    }    //bouncy castle实现md2方式    public static String bcMd2(String src) {        MD2Digest md2Digest = new MD2Digest();        md2Digest.update(src.getBytes(), 0, src.getBytes().length);        byte[] md2bytes = new byte[md2Digest.getDigestSize()];        md2Digest.doFinal(md2bytes, 0);        return org.bouncycastle.util.encoders.Hex.toHexString(md2bytes);    }    //bouncy castle实现md4方式    public static String bcMd4(String src) {        MD4Digest md4Digest = new MD4Digest();        md4Digest.update(src.getBytes(), 0, src.getBytes().length);        byte[] md4bytes = new byte[md4Digest.getDigestSize()];        md4Digest.doFinal(md4bytes, 0);        return org.bouncycastle.util.encoders.Hex.toHexString(md4bytes);    }    //bouncy castle实现md5方式    public static String bcMd5(String src) {        MD5Digest md5Digest = new MD5Digest();        md5Digest.update(src.getBytes(), 0, src.getBytes().length);        byte[] md5bytes = new byte[md5Digest.getDigestSize()];        md5Digest.doFinal(md5bytes, 0);        return org.bouncycastle.util.encoders.Hex.toHexString(md5bytes);    }}
运行结果:
------>encyData bc md2:2cc409a3c62177ae523ad5e410a718f4------>encyData bc md4:41ddb0c4de7de1e4d442f9e110a51f6c------>encyData bc md5:3ea5c9303c2be83f82ffb769345bb338
</pre><div></div>  另外做android的同学如果引入了databinding框架,google在其中已经盗版了apache commoms codec 的加密解密,无需额外添加jar了

1 0
原创粉丝点击