简单的了解下什么是MID5加密
------解决方案--------------------
首先MD5不是加密(加密/解密必须是可逆的),而是做不可逆的信息摘要。
md5('123456') ==> e10adc3949ba59abbe56e057f20f883e
md5('12345') ==> 827ccb0eea8a706c4c34a16891f84e7b
md5('abcd') ==> e2fc714c4727ee9395f324cd2e7f331f
md5('abc') ==> 900150983cd24fb0d6963f7d28e17f72
可以发现,原文即使很接近,其MD5结果也相差很大,因此,很难比较轻易的将md5反向成原文。
比如登录密码,登录的时候,是将输入的密码再做一次MD5,和之前保存在数据库里面的MD5比较一下,相同,则说明密码相同,不同,则密码错误。当然,MD5可能会有冲突,比如e10adc3949ba59abbe56e057f20f883e可能对应123456,但也可能对应123456.................xxxx,但是在可能的密码长度内,不可能出现冲突。
好处是即使数据库管理员,也很难直接获取用户的密码明文
当然,md5不是不能破解,但网上的都是属于暴利型。先将所有可能的密码都算一遍md5,放到数据库里面,然后再拿用户的md5到数据库里面去查找,找到对应的原文。但那个代价太大了,由26个字母组成的6位密码,就有3亿种组合
------解决方案--------------------
Hash算法主要用于信息安全领域中加密,他可以把一些不同长度的信息转化成固定长度的128位编码。
MD5和SHA是目前应用最为广泛的Hash算法,主要应用文件校验、数字签名和鉴权协议等领域。
MD5和SHA属于非对称性加密算法,一般被认为是不可逆的。
Java在实现MD5和SHA-1算法加密时,主要使用了java.security.MessageDigest类。MessageDigest类为应用程序提供信息摘要算法的功能,例如MD5、SHA-1算法。
信息摘要是安全的单向散列函数,它接收任意大小的数据,输出固定长度的散列值。
我写的一个关于MD5加密的方法,如下:
- Java code
public class Encryption { /** * @param args */ public static void main(String[] args) { System.out.println(Encryption.getMD5Str("1111")); } public static String getMD5Str(String str) { MessageDigest messageDigest = null; try { messageDigest = MessageDigest.getInstance("MD5"); messageDigest.reset(); messageDigest.update(str.getBytes("UTF-8")); } catch (NoSuchAlgorithmException e) { System.out.println("NoSuchAlgorithmException caught!"); System.exit(-1); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } byte [] byteArray = messageDigest.digest(); StringBuffer md5StringBuffer = new StringBuffer(); for(int i = 0; i < byteArray.length; ++ i) { if(Integer.toHexString(0xFF & byteArray[i]).length() == 1) { md5StringBuffer.append("0"); md5StringBuffer.append(Integer.toHexString(0xFF & byteArray[i])); } else { md5StringBuffer.append(Integer.toHexString(0xFF & byteArray[i])); } } return md5StringBuffer.toString(); }}