Java对字符串使用MD5进行加密(亲测有效)

转自:https://blog.csdn.net/jay314159/article/details/4918358

前言:

   MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的算法之一,主流的编程语言均有MD5的实现。

  将数据(字符串)运算为另一固定长度值是加密的基本原理,MD5的前身有MD2、MD3、MD4。

  本文介绍使用MD5进行加密和验证,将原本的字符串通过MD5加密后成另一个字符串,而且根据新的字符串无法获得原字符串,但可以在不知道原始密码的情况下进行验证。

关键技术:

  通过java.security.MessageDigest的静态方法getInstance创建具有指定算法名称的信息摘要,参数为算法名,传入"MD5"则表明要使用MD5算法。

  MessageDigest的digest实例方法使用指定的字节数组对摘要进行最后更新,然后完成摘要计算,返回存放哈希值结果的季节数组,这个数组就是MD5加密产品。

  将加密后的字节数组转换成十六进制的字符窜,形成最终的密码。

  当输入字符串经过MD5加密后,得到的字符串与密码一样,则认为密码验证通过。

实例演示:

package com.zhanzhuang.md5;

import java.security.MessageDigest;

/**
 * @author zhan zhuang
 * @time 2018年6月8日下午1:48:06
 *
 */
public class Encryption {

    public static void main(String[] args) {

        String password = Encryption.createPassword("123456");

        System.out.println("对123456用MD5加密后的密码为:" + password);

        String inputstr = "1234";

        System.out.println("1234与密码相同?" + Encryption.authenticatePassword(password, inputstr));

        inputstr = "123456";

        System.out.println("123456与密码相同?" + Encryption.authenticatePassword(password, inputstr));

    }

    // 16进制下数字到字符的映射数组
    private static String[] hexDigits = new String[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c",
            "d", "e", "f" };

    // 将inputstr加密的方法
    public static String createPassword(String inputstr) {
        return encodeByMD5(inputstr);
    }

    // 验证密码是否正确
    public static boolean authenticatePassword(String pass, String inputstr) {
        if (pass.equals((encodeByMD5(inputstr)))) {
            return true;
        } else {
            return false;
        }
    }

    // 对字符串进行MD5编码
    private static String encodeByMD5(String originstr) {
        if (originstr != null) {
            try {
                // 创建具有指定算法名称的信息摘要
                MessageDigest md = MessageDigest.getInstance("MD5");
                // 使用指定的字节数组对摘要进行最后的更新,然后完成摘要计算
                byte[] results = md.digest(originstr.getBytes());
                // 将得到的字节数组编程字符串返回
                String resultString = byteArrayToHexString(results);
                return resultString.toUpperCase();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return null;
    }

    // 转换字节数组为十六进制字符串
    private static String byteArrayToHexString(byte[] b) {
        StringBuffer resultsb = new StringBuffer();
        int i = 0;
        for (i = 0; i < b.length; i++) {
            resultsb.append(byteToHexString(b[i]));
        }
        return resultsb.toString();
    }

    // 将字节转化成十六进制的字符串
    private static String byteToHexString(byte b) {
        int n = b;
        if (n < 0) {
            n = 256 + n;
        }
        int d1 = n / 16;
        int d2 = n / 16;
        return hexDigits[d1] + hexDigits[d2];
    }

}

 

猜你喜欢

转载自www.cnblogs.com/zhanzhuang/p/9155323.html