[mobilesafe] 07_MD5加密算法

Android 4.0

MD5加密算法

MD5加密步骤:1、 MessageDigest.getInstance("MD5");获取一个md5实例,会抛出NoSuchAlgorithmException没有此算法异常
2、调用digest(byte[] b)
 ,messageDigest.digest("1234".getBytes());进行加密,参数为byte[]数组,加密后还是返回byte[]数组
3、将加密后byte[]数组,每一个byte用16进制,与0xff进行与&操作,然后
Integer.toHexString(result),将该byte转换成一个16进制的字符串,
4、3步骤中,可能会出现一个的字符串,此时,需要进行判断,将只有一个字符串的byte,在其前面加上一个0,凑齐两个数
MD5拓展:
a) md5在线解密:
http://www.cmd5.com/  
b) webqq: http://web2.qq.com/   进行三次MD5加密-将加密后的密文再进行加密  
    |--md5(md5(md5($pass)))   第一次加密后,结果转换成小写,对结果再加密一次,结果转换成小写,对结果再加密一次,上面那网站支持。
c)银行密码:6位数字,进行10~20次MD5加密
代码:
package cn.zengfansheng.md5;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Md5DigestDemo {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        // 1、获取一个MD5加密器
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        // 2、进行加密,返回加密后的byte[]数组
        byte[] digest = messageDigest.digest("1234".getBytes());
        // 3、加密后将每一个byte转换成16进制的字符串表示
        StringBuilder sb = new StringBuilder();
        for (byte b : digest) {
            int result = b & 0xff;// 3-1将每一个byte(8位),进行与操作0xff
            String hexString = Integer.toHexString(result);// 3-2转成16进制字符串表示
            //System.out.print(hexString + " ");// 81 dc 9b db 52 d0 4d c2 0 36 db d8 31 3e d0 55
            if (hexString.length() == 1) {// 3-3 如果某一位转换成16进制是一位数字,那么在其前面加上0
                hexString = "0" + hexString;
            }
            System.out.print(hexString + " ");//81 dc 9b db 52 d0 4d c2 00 36 db d8 31 3e d0 55 
            sb.append(hexString);
        }
        System.out.println(" " + sb.toString());
    }
}
MD5加密工具类:
package cn.zengfansheng.mobilesafe.utils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
 * 1、MD5 加密类
 * 
 * @author hacket
 */
public class MD5Utils {
    /** 
     * 1、将明文plainText进行加密返回
     * @param plainText 要进行加密的明文
     * @return 返回明文,传入为null,那么返回null
     */
    public static String encode(String plainText) {
        if (plainText!=null) {
            try {
                MessageDigest messageDigest = MessageDigest.getInstance("md5");
                byte[] bytes = messageDigest.digest(plainText.getBytes());
                StringBuilder stringBuilder = new StringBuilder();
                for (byte b : bytes) {
                    int result = b & 0xff;
                    String hexString = Integer.toHexString(result);
                    if (hexString.length() == 1) {
                        stringBuilder.append("0");
                    }
                    stringBuilder.append(hexString);
                }
                return messageDigest.toString();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace(); // can't reach 不可达到的异常,所以处理掉
                return null;
            }
        }else {
            return null;
        }
    }
}