欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MD5工具类 加盐加密 及编码

程序员文章站 2024-03-19 09:33:22
...

titls: MD5工具类加密
date: 2018/11/12 10:03:42
categories: 开发module


import java.security.MessageDigest;
import java.util.Base64;
import java.util.Random;
import java.util.UUID;

/**
 * @description: MD5密码加盐加密 Base64 编码解码
 * @Author: yim
 * @Date: 2018/11/9 11:06
 **/
public class MD5Tools {

    /*
     * @description: 使用uuid生成随机盐
     * @author: yim
     * @params: []
     * @return: java.lang.String
     */
    public static String saltRandom(){
        UUID uuid = UUID.randomUUID();
        String[] split = uuid.toString().split("-");
        String uu = "";
        for (int i = 0; i < split.length; i++) {
            uu += split[i];
        }
        return uu;
    }
    
    /*
     * @description: 使用md进行加密
     * @author: yim
     * @params: [md] 
     * @return: java.lang.String
     */
    public static String MD5Method(String md){
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] bytes = md5.digest(md.getBytes("UTF-8"));
            for (int i = 0; i < bytes.length; i++) {
                byte aByte = bytes[i];
            }
            return toHex(bytes);
        } catch (Exception e) {
            throw new RuntimeException();
        }
    }

    public static String MD5Dencode(){
        return new String();
    }
    /*
     * @description: byte[] 数组进行十六进制转换,
     *  位运算符---- << >> 左移运算符和右移运算符,表示按照二进制的方式进行左右移动的位置(符合电脑计算方式,效率最高) >>>无符号位右移
     *  $ | ^ 分别表示按位与 按位或 和按位异与  (也是用二进制的方式进行判断) 1 & 0 = 0(一0为0) 1 | 0 =  1(一1为1) 0 ^ 0 =0 (相同为0 不同为1)
     *  二进制逢二进一 二进制是以0b开头
     *  八进制逢八进一 三位二进制一组 000 001 010 011 100 101 110 111(0~7)(二进制与八进制之间的关系) 以0开头的表示八进制
     *  十六进制逢十六进一 四位二进制一组0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111(0~F)(二进制与十六进制之间的关系) 以0x开头表示十六进制
     *  一个字节八位 byte表示字节 一个字节所占的大小在-128~127之间用二进制表示为 0000 0000 ~ 0111 1111(正数部分表示范围) 1000 0000 ~ 1111 1111(负数部分表示范围)
     *  (计算机的原码 反码 和补码 表示的都是整数概念-- 正整数时结果相同 负整数时反码对原码进行按位取反,补码在反码的基础上进行+1)
     *  -2  原码 0000 0010 反码 1111 1101 补码 1111 1110
     *  -128 原码 1000 0000 反码 0111 1111 补码 1000 0000
     *  m & n (进行二进制计算 以右侧为依据得到的结果<=n)
     * @author: yimugod
     * @params: [bytes] 
     * @return: java.lang.String
     */
    private static String toHex(byte[] bytes){
        final char[] chars = "0123456789ABCDEF".toCharArray();
        StringBuilder stringBuilder = new StringBuilder(bytes.length*2);//stringBuilder下for循环中使用两次,所以指定长度*2
        for (int i = 0; i < bytes.length; i++) {
            stringBuilder.append(chars[(bytes[i] >> 4) & 0x0f]);//bytes[i]表示一个字节大小的整数,二进制右移四位表示的数值范围为(0~F)之间,并和16进制的15进行按位与 得到较小值
            stringBuilder.append(chars[bytes[i] & 0x0f]);//通过运算得到一个<=15的下标值
        }
        return stringBuilder.toString();
    }

    /*
     * @description: 使用Base64进行编码
     * @author: yim
     * @params: [data]
     * @return: java.lang.String
     */
    public static String  encode(String data){
        final Base64.Encoder encoder = Base64.getEncoder();
        final String encodeData = encoder.encodeToString(data.getBytes());
        return encodeData;
    }

    /*
     * @description: 使用Base64进行解码
     * @author: yim
     * @params: [data]
     * @return: java.lang.String
     */
    public static String dencode(String data){
        final Base64.Decoder decoder = Base64.getDecoder();
        final byte[] decode = decoder.decode(data);
        return new String(decode);
    }

    /*
     * @description: 用于使用中使用==的方式没有比较没有结果.故使用equals进行比较进行测试
     * @author: yim
     * @params: [args] 
     * @return: void
     */
    public static void main(String[] args) {
        String saltRandom = saltRandom();
        String md5Method = MD5Method(saltRandom + "123");
        String method = MD5Method(saltRandom + "123");
        System.out.println(md5Method);
        System.out.println(method);
        if (method == md5Method || md5Method.equals(method)) {
            System.out.println("MD5 没有问题!");
        }
    }
}

上一篇: js md5

下一篇: 2019.8.1 JZ DAY1总结