美文网首页
JAVA使用MD5加密解密

JAVA使用MD5加密解密

作者: Yile_Liang | 来源:发表于2018-12-29 11:36 被阅读67次

    MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

        这波解释是不是很正经严肃,好像看懂了,但是如果有人问MD5是什么,MD5就是...就是小编也不知道,通俗一点MD5是一种算法,用于数据的安全方面对数据进行加密和解密,虽然MD5被认为不安全,而且渐渐被AES所取代,但是对于一般的情况下使用时可以的,例如某个管理后台的账号密码加密,普通的HTTP请求签名,数据库存储的一些重要数据加密,在这小编就说一下MD5在Java上的使用。

        在JDK内部集成多种算法,包括MD5和AES等,那MD5在Java上的使用就非常简单了,默认的加密是小写的,如下

        知道你们这些懒人肯定要可以复制的源码,小编会在最后附上整个工具类的源码的,默认的加密就是生成小写,但是如果想要使用大写也非常简单,就是使用,自定义一个数组,代码如下

        下面附上整个工具类的源码,小编哪里有写的不好或者有错误,希望大家能留言指出

    import org.apache.commons.codec.binary.Hex;

    import java.security.MessageDigest;

    import java.security.NoSuchAlgorithmException;

    import java.util.Random;

    public class MD5Utils {

    /**

        * 普通MD5加密(小写+字母)

        * @param str 要加密的字符串

        */

        public static StringgetStrMD5(String str) {

    // 获取MD5实例

            MessageDigest md5 =null;

            try {

    md5 = MessageDigest.getInstance("MD5");

            }catch (NoSuchAlgorithmException e) {

    e.printStackTrace();

                System.out.println(e.toString());

                return "获取MD5实例异常";

            }

    // 将加密字符串转换为字符数组

            char[] charArray = str.toCharArray();

            byte[] byteArray =new byte[charArray.length];

            // 开始加密

            for (int i =0; i < charArray.length; i++)

    byteArray[i] = (byte) charArray[i];

            byte[] digest = md5.digest(byteArray);

            StringBuilder sb =new StringBuilder();

            for (int i =0; i < digest.length; i++) {

    int var = digest[i] &0xff;

                if (var <16)

    sb.append("0");

                sb.append(Integer.toHexString(var));

            }

    return sb.toString();

        }

    /**

        * 普通MD5加密(大写+字母)

        * @param password 要加密的字符串

        */

        public static StringgetStrrMD5(String password) {

    char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

            try {

    byte strTemp[] = password.getBytes("UTF-8");

                MessageDigest mdTemp = MessageDigest.getInstance("MD5");

                mdTemp.update(strTemp);

                byte md[] = mdTemp.digest();

                int j = md.length;

                char str[] =new char[j *2];

                int k =0;

                for (int i =0; i < j; i++) {

    byte byte0 = md[i];

                    str[k++] = hexDigits[byte0 >>>4 &15];

                    str[k++] = hexDigits[byte0 &15];

                }

    return new String(str);

            }catch (Exception e) {

    return null;

            }

    }

    /**

        * MD5双重解密

        */

        public static StringgetconvertMD5(String inStr) {

    char[] charArray = inStr.toCharArray();

            for (int i =0; i < charArray.length; i++) {

    charArray[i] = (char) (charArray[i] ^'t');

            }

    String str = String.valueOf(charArray);

            return str;

        }

    /**

        * 使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转

        */

        @SuppressWarnings("unused")

    private static Stringmd5Hex(String str) {

    try {

    MessageDigest md = MessageDigest.getInstance("MD5");

                byte[] digest = md.digest(str.getBytes());

                return new String(new Hex().encode(digest));

            }catch (Exception e) {

    e.printStackTrace();

                System.out.println(e.toString());

                return "";

            }

    }

    /**

        * 加盐MD5加密

        */

        public static StringgetSaltMD5(String password) {

    // 生成一个16位的随机数

            Random random =new Random();

            StringBuilder sBuilder =new StringBuilder(16);

            sBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999));

            int len = sBuilder.length();

            if (len <16) {

    for (int i =0; i <16 - len; i++) {

    sBuilder.append("0");

                }

    }

    // 生成最终的加密盐

            String Salt = sBuilder.toString();

            password =md5Hex(password + Salt);

            char[] cs =new char[48];

            for (int i =0; i <48; i +=3) {

    cs[i] = password.charAt(i /3 *2);

                char c = Salt.charAt(i /3);

                cs[i +1] = c;

                cs[i +2] = password.charAt(i /3 *2 +1);

            }

    return String.valueOf(cs);

        }

    /**

        * 验证加盐后是否和原文一致

        */

        public static boolean getSaltverifyMD5(String password, String md5str) {

    char[] cs1 =new char[32];

            char[] cs2 =new char[16];

            for (int i =0; i <48; i +=3) {

    cs1[i /3 *2] = md5str.charAt(i);

                cs1[i /3 *2 +1] = md5str.charAt(i +2);

                cs2[i /3] = md5str.charAt(i +1);

            }

    String Salt =new String(cs2);

            return md5Hex(password + Salt).equals(String.valueOf(cs1));

        }

    public static void main(String[] args) {

    System.out.println(getStrMD5("admin"));

            System.out.println(getStrrMD5("admin"));

        }

    }

    相关文章

      网友评论

          本文标题:JAVA使用MD5加密解密

          本文链接:https://www.haomeiwen.com/subject/ptjulqtx.html