什么是MD5加密
? ? 百度给出的解释是:MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。
MD5 作用
? ? MD5在论坛上、软件发布时经常用,是为了保证文件的正确性,防止一些人盗用程序,加些木马或者篡改版权,设计的一套验证系统。每个文件都可以用MD5验证程序算出一个固定的MD5码来。 MD5所有加密后的数据长度都是32位,且每位都是由16进制的数字代表,只需对字符串做简单的修改,得到的MD5数据都是大不相同的。对于一些必要重要的密码或者签名,我们都需要通过MD5加密后保存,MD5具有不可逆性,不能被反解码,然而有一些公司通过建立数据库存储MD5的各种值来实现解码,但是其数据库包含数据有限,依然不能做到完全解码,我们只需要对MD5加密后进行处理能很容易的使其不能被解码。
?
实现方法有:
1.对已经进行过MD5加密的数据再次进行MD5加密。
2.对原有数据加一串其他字符来使其变得复杂也可以做到不能被解码。(所加字符串一般是已经协商好的)
? ? 1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、不可逆:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别,且不可逆。
4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。
MD5加密原理
? ?先将字符串转换成字节数组把数组中每个字节拿出来与0xFF相与将其所得值转换成int型,得到一个16组的数据,每组数据都占两位,当然得到的数据可能不是32位,但是MD5的数据严格要求所得数据必须是32位,所以我们会遍历数组把不是两位的数据其前面加上一个0使其成为两位。这样我们就一定能的到一个32位的数据了。
public static String createMD5(String str) {
? ? ? ? StringBuffer stringBuffer = null;
? ? ? ? String hexString = null;
? ? ? ? try {
? ? ? ? ? ? ? ? //1.指定加密算法类型
? ? ? ? ? ? ? ? MessageDigest digest = MessageDigest.getInstance("MD5");
? ? ? ? ? ? ? ? //2.将需要加密的字符串转换成byte数组
? ? ? ? ? ? ? ? byte[] hash = digest.digest(str.getBytes("UTF-8"));
? ? ? ? ? ? ? ? //3.拼接数据
? ? ? ? ? ? ? ? stringBuffer = new StringBuffer();
? ? ? ? ? ? ? ? for (byte b : hash) {
? ? ? ? ? ? ? ? ? ? int i = b&0xFF;
? ? ? ? ? ? ? ? ? ? //int类型的i需要转换成16进制
? ? ? ? ? ? ? ? ? ? hexString = Integer.toHexString(i);
? ? ? ? ? ? ? ? ? ? if(hexString.length()<2) {
? ? ? ? ? ? ? ? ? ? ? ? ?hexString = "0"+hexString;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? stringBuffer.append(hexString);
? ? ? ? ? ? ? ? }
? ? ? ? } catch (NoSuchAlgorithmException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? throw new RuntimeException("Huh, MD5 should be supported?", e);
? ? ? ? } catch (UnsupportedEncodingException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? throw new RuntimeException("Huh, UTF-8 should be supported?", e);
? ? ? ? }
? ? ? ? return stringBuffer.toString();
? ? }