MD5加密分析:
JDK API:
获取对象的API:
加密的API:
1 package cn.utils; 2 3 import java.security.MessageDigest; 4 import java.security.NoSuchAlgorithmException; 5 6 /** 7 * @author CQY13 MD5加密工具类 8 */ 9 public class MD5Utils { 10 11 /** 12 * 获取MD5加密 13 * 14 * @param pwd 15 * 需要加密的字符串 16 * @return String字符串 加密后的字符串 17 */ 18 public static String getPwd(String pwd) { 19 try { 20 // 创建加密对象 21 MessageDigest digest = MessageDigest.getInstance("md5"); 22 23 // 调用加密对象的方法,加密的动作已经完成 24 byte[] bs = digest.digest(pwd.getBytes()); 25 // 接下来,我们要对加密后的结果,进行优化,按照mysql的优化思路走 26 // mysql的优化思路: 27 // 第一步,将数据全部转换成正数: 28 String hexString = ""; 29 for (byte b : bs) { 30 // 第一步,将数据全部转换成正数: 31 // 解释:为什么采用b&255 32 /* 33 * b:它本来是一个byte类型的数据(1个字节) 255:是一个int类型的数据(4个字节) 34 * byte类型的数据与int类型的数据进行运算,会自动类型提升为int类型 eg: b: 1001 1100(原始数据) 35 * 运算时: b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 0000 36 * 0000 0000 0000 0000 0000 1111 1111 结果:0000 0000 0000 0000 37 * 0000 0000 1001 1100 此时的temp是一个int类型的整数 38 */ 39 int temp = b & 255; 40 // 第二步,将所有的数据转换成16进制的形式 41 // 注意:转换的时候注意if正数>=0&&<16,那么如果使用Integer.toHexString(),可能会造成缺少位数 42 // 因此,需要对temp进行判断 43 if (temp < 16 && temp >= 0) { 44 // 手动补上一个“0” 45 hexString = hexString + "0" + Integer.toHexString(temp); 46 } else { 47 hexString = hexString + Integer.toHexString(temp); 48 } 49 } 50 return hexString; 51 } catch (NoSuchAlgorithmException e) { 52 // TODO Auto-generated catch block 53 e.printStackTrace(); 54 } 55 return ""; 56 } 57 58 /** 59 * @param args 60 */ 61 public static void main(String[] args) { 62 String pwd = MD5Utils.getPwd("abc"); 63 System.out.println(pwd); 64 } 65 66 }