首页 > 程序开发 > 移动开发 > Android >

MD5加密算法及应用

2016-08-20

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

先说一句据我了解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();

	}
相关文章
最新文章
热点推荐