JAVA中MD5的转换

发布时间:2020-06-02 07:29:10 作者:沙漏半杯
来源:网络 阅读:389


import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import java.util.Arrays;

import java.util.Scanner;

 

public class MD5{   

       

    private static final String HEX_NUMS_STR="0123456789ABCDEF";   

    private static final Integer SALT_LENGTH = 12;   

       

    /**   

     * 将16进制字符串转换成字节数组   

     * @param hex   

     * @return   

     */ 

    public static byte[] hexStringToByte(String hex) {   

        int len = (hex.length() / 2);   

        byte[] result = new byte[len];   

        char[] hexChars = hex.toCharArray();   

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

            int pos = i * 2;   

            result[i] = (byte)(HEX_NUMS_STR.indexOf(hexChars[pos]) << 4 | HEX_NUMS_STR.indexOf(hexChars[pos + 1]));   

        }   

        return result;   

    }   

 

       

    /** 

     * 将指定byte数组转换成16进制字符串 

     * @param b 

     * @return 

     */ 

    public static String byteToHexString(byte[] b) {   

        StringBuffer hexString = new StringBuffer();   

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

        //0XFF表示十进制的255,其中0X是java中用来申明16进制字符使用的,此时表示取当前字节的反码

            String hex = Integer.toHexString(b[i] & 0xFF);  

            if (hex.length() == 1) {   

                hex = '0' + hex;   

            }   

            hexString.append(hex.toUpperCase());   

        }   

        return hexString.toString();   

    }   

    /** 

     * 获得加密后的16进制形式字符串

     * @param password 

     * @return 

     * @throws NoSuchAlgorithmException 

     * @throws UnsupportedEncodingException 

     */ 

    public static String getEncryptedPwd(String sourceString)   

            throws NoSuchAlgorithmException, UnsupportedEncodingException {   

        //声明加密后的口令数组变量   

        byte[] pwd = null;   

        //随机数生成器   

        SecureRandom random = new SecureRandom();   

        //声明盐数组变量   

        byte[] salt = new byte[SALT_LENGTH];   

        //将随机数放入盐变量中   

        random.nextBytes(salt);   

 

        //声明消息摘要对象   

        MessageDigest md = null;   

        //创建消息摘要   

        md = MessageDigest.getInstance("MD5");   

        //将盐数据传入消息摘要对象   

        md.update(salt);   

        //将口令的数据传给消息摘要对象   

        md.update(sourceString.getBytes("UTF-8"));   

        //获得消息摘要的字节数组   

        byte[] digest = md.digest();   

 

        //因为要在口令的字节数组中存放盐,所以加上盐的字节长度   

        pwd = new byte[digest.length + SALT_LENGTH];   

        //将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐   

        System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);   

        //将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节   

        System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);   

        //将字节数组格式加密后的口令转化为16进制字符串格式的口令   

        return byteToHexString(pwd);   

    } 

    

    /** 

     * 验证口令是否合法 

     * @param password 

     * @param passwordInDb 

     * @return 

     * @throws NoSuchAlgorithmException 

     * @throws UnsupportedEncodingException 

     */ 

    public static boolean validPassword(String sourceString, String md5String)   

            throws NoSuchAlgorithmException, UnsupportedEncodingException {   

        //将16进制字符串格式口令转换成字节数组   

        byte[] pwdInDb = hexStringToByte(md5String);   

        //声明盐变量   

        byte[] salt = new byte[SALT_LENGTH];   

        //将盐从数据库中保存的口令字节数组中提取出来   

        System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);   

        //创建消息摘要对象   

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

        //将盐数据传入消息摘要对象   

        md.update(salt);   

        //将口令的数据传给消息摘要对象   

        md.update(sourceString.getBytes("UTF-8"));   

        //生成输入口令的消息摘要   

        byte[] digest = md.digest();   

        //声明一个保存数据库中口令消息摘要的变量   

        byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH];   

        //取得数据库中口令的消息摘要   

        System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, digestInDb.length);   

        //比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同   

        if (Arrays.equals(digest, digestInDb)) {   

            //口令正确返回口令匹配消息   

            return true;   

        } else {   

            //口令不正确返回口令不匹配消息   

            return false;   

        }   

    }  

 

    public static void  main(String[] args){

    System.out.println("-----------------MD5加密 start--------------------");

    try {

    System.out.print("-----------------请输入您要加密的内容按enter键后执行:");

    Scanner scanner = new Scanner(System.in);

    String sourceString = scanner.nextLine();

    String md5String = getEncryptedPwd(sourceString);

   

    System.out.println("----------加密前:"+sourceString);

    System.out.println("----------加密后:"+md5String);

    boolean falg = validPassword(sourceString,md5String);

    System.out.println("----------输入字符串校验结果:"+falg);

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("-----------------MD5加密 end--------------------");

    }

}



推荐阅读:
  1. Java中如何转换父类和子类
  2. Java中怎么实现数值类型的转换

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java md5 转换

上一篇:jQuery插进 tooltip提示和validate

下一篇:PHP高级程序员所要掌握的技能

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》