MD5加密算法

方式一:容易懂

public class MD5Util {

    private MD5Util() {
    }

    public static String md5(String sourceStr) {

        Objects.requireNonNull(sourceStr);
        StringBuilder builder = new StringBuilder();
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.update(sourceStr.getBytes());
            byte[] bytes = messageDigest.digest();
            for (byte aByte : bytes) {
                builder.append(byteToHex(aByte));
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return builder.toString().toUpperCase();
    }

    private static final char[] array = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    private static String byteToHex(byte aByte) {
        int num = aByte;
        //将负数转换为正数。采用16进制无符号数表示。
        //-128~127    0~255
        if (num < 0) {
            num += 256;
        }
        //每个字节8bit,16进制数字占4bit
        //所以一个字节表示两个16进制数
        //将前四个位取出来为一个16进制数
        int low = num / 16;
        //将后四位取出来转换为16进制数
        int high = num % 16;
        return array[low] + "" + array[high];
    }
}

方式二:xue微难懂

public class MD5Util {
    public static String MD5(String strs) {
        /*
         * 加密需要使用JDK中提供的类
         */
        StringBuffer sb = new StringBuffer();
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            byte[] bs = digest.digest(strs.getBytes());
            /*
             * 加密后的数据是-128 到 127 之间的数字,这个数字也不安全。 取出每个数组的某些二进制位进行某些运算,得到一个新的加密结果
             *
             * 0000 0011 0000 0100 0010 0000 0110 0001 &0000 0000 0000 0000 0000
             * 0000 1111 1111 --------------------------------------------- 0000
             * 0000 0000 0000 0000 0000 0110 0001
             *
             * 把取出的数据转成十六进制数
             */
            for (byte b : bs) {
                //将负数转化为正数,就是+255
                int x = b & 255;
                //将转换后的整数变为16进制无符号数字的字符串形式
                String s = Integer.toHexString(x);
                //如果x<16说明16进制数不够进位,又因为每字节会转换成2位16进制数,所以高位要补0
                if (x < 16) {
                    sb.append("0");
                }
                sb.append(s);
            }

        } catch (Exception e) {
            System.out.println("加密失败");
        }
        return sb.toString();
    }

    //测试
    public static void main(String[] args) {
        String s = MD5Util.MD5("qqw11111111111123456");
        System.out.println(s);
    }
}

 

上一篇:Linux基础 - 定时任务


下一篇:crontab安装以及定时任务的执行