MD5—加密,加盐

MD5的参考盐值:String salt = "212*)()()**()^&UYGbakdkj " ;
MD5—加密工具类
package com.demo.tools;
  import java.security.MessageDigest;
  import java.security.NoSuchAlgorithmException;
  
  /**
   * @author xdx14 MD5加密工具类
   */
  public class MD5Utils {
 
     /**
      * 获取32位数的MD5加密
      * 
      * @param pwd
      *            需要加密的字符串
      * @return String字符串 加密后的字符串
      */
     public static String getPwd(String pwd) {
         try {
             // 创建加密对象MessageDigest
             // 提供信息摘要算法的功能,如 MD5 或 SHA 算法。
             // 信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
             MessageDigest digest = MessageDigest.getInstance("md5");
             
             
             
             // 调用加密对象的方法,加密的动作已经完成
             byte[] bs = digest.digest(pwd.getBytes());
             // 接下来,我们要对加密后的结果,进行优化,按照mysql的优化思路走
             // mysql的优化思路:
             // 第一步,将数据全部转换成正数:
             String hexString = "";
             for (byte b : bs) {
                 // 第一步,将数据全部转换成正数// 解释:为什么采用b&255
                 /*
                  * b:它本来是一个byte类型的数据(1个字节) 255:是一个int类型的数据(4个字节)
                  * byte类型的数据与int类型的数据进行运算,会自动类型提升为int类型 eg: b: 1001 1100(原始数据)
                  * 运算时: b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 0000
                  * 0000 0000 0000 0000 0000 1111 1111 结果:0000 0000 0000 0000
                  * 0000 0000 1001 1100 此时的temp是一个int类型的整数
                  */
                 int temp = b & 255;
                 // 第二步,将所有的数据转换成16进制的形式
                 // 注意:转换的时候注意if正数>=0&&<16,那么如果使用Integer.toHexString(),可能会造成缺少位数
                 // 因此,需要对temp进行判断
                 if (temp < 16 && temp >= 0) {
                     // 手动补上一个“0”
                     //static String toHexString(int i)
                     //以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
                     hexString = hexString + "0" + Integer.toHexString(temp);
                    
                     //补充:
                     //static String  toString(int i, int radix) 返回用第二个参数指定基数表示的第一个参数的字符串表示形式
                     //static Integer valueOf(String s, int radix) 返回一个 Integer 对象,该对象中保存了用第二个参数提供的基数进行解析时从指定的 String 中提取的值。
                     //补充结束!
                     
                     
                 } else {
                     hexString = hexString + Integer.toHexString(temp);
                 }
             }
             return hexString;
         } catch (NoSuchAlgorithmException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         return "";
     }
 
     /**
      * @param args
      */
     public static void main(String[] args) {
         String pwd = MD5Utils.getPwd("111");
         System.out.println(pwd);
     }
 
 }

原文地址:https://www.cnblogs.com/domi22/p/8059590.html