MD5加密算法及应用

来源:互联网 发布:缅甸非法网络彩票赌博 编辑:程序博客网 时间:2024/06/05 20:50

先说一句据我了解MD5向源信息的转变是一个不可逆的过程。没有解密算法。不过目前好像已经被破解了山东大学王小云教授

主要有以下两方面的应用:


1.数字签名:可以检测文件或其他应用的完整性,判断有无修改;

数字签名技术普遍应用于软件下载站,论坛数据库,系统文件安全等方面,如:当我们下载某一软件时,经常会在该软件的描述信息中找到其MD5值来用于下载后的校验过程,从而有效防止病毒。

2.MD5还普遍应用于操作系统或一般系统的登录认证上,如当我们开发使用人员管理系统时,发现数据库表中所存储的用户密码并不是用户所输入的原生态的密码格式,而是经过MD5处理后的一段字符串。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,在和数据库表中的md5值进行比较来确定输入密码是否正确。这样便避免了普通用户的密码被具有系统管理员权限的用户查到,即使查数据库,得到的也只是MD5处理后的信息

加密算法:

import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MD5Util {public String getMD5(byte[] source){String s=null;//用来将字节转换成16进制表示的字符char[] hexDigits={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};try {MessageDigest md=MessageDigest.getInstance("MD5");md.update(source);//MD5的计算结果是一个128位的长整数,用字节表示为16个字节byte[] tmp=md.digest();//每个字节用16进制表示的话,使用2个字符(高4位一个,低4位一个),所以表示成16进制需要32个字符char[] str=new char[16*2];int k=0;//转换结果中对应的字符位置for(int i=0;i<16;i++){//对MD5的每一个字节转换成16进制字符byte byte0=tmp[i];str[k++]=hexDigits[byte0>>>4 & 0xf];//对字节高4位进行16进制转换str[k++]=hexDigits[byte0 & 0xf];    //对字节低4位进行16进制转换}s=new String(str);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return s;}public static void main(String[] args) {MD5Util md5Util=new MD5Util();String result=md5Util.getMD5("abc".getBytes());System.out.println(result);}}

改良版,加密string类型:

/*** * MD5加码 生成32位md5码 */public static String string2MD5(String inStr){MessageDigest md5 = null;try{md5 = MessageDigest.getInstance("MD5");}catch (Exception e){System.out.println(e.toString());e.printStackTrace();return "";}char[] charArray = inStr.toCharArray();byte[] byteArray = new byte[charArray.length];for (int i = 0; i < charArray.length; i++)byteArray[i] = (byte) charArray[i];byte[] md5Bytes = md5.digest(byteArray);StringBuffer hexValue = new StringBuffer();for (int i = 0; i < md5Bytes.length; i++){int val = ((int) md5Bytes[i]) & 0xff;if (val < 16)hexValue.append("0");hexValue.append(Integer.toHexString(val));}return hexValue.toString();}


0 0
原创粉丝点击