Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1009|回复: 0

java MD5加密解密类

[复制链接]

该用户从未签到

发表于 2011-10-13 13:29:23 | 显示全部楼层 |阅读模式
package com.zyg.security.md5;     

   import java.io.UnsupportedEncodingException;     

   import java.security.MessageDigest;     

   import java.security.NoSuchAlgorithmException;     

   import java.security.SecureRandom;     

   import java.util.Arrays;     

   public class MyMD5Util {     

       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 = (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++) {     

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

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

                   hex = '0' + hex;     

               }     

               hexString.append(hex.toUpperCase());     

           }     

           return hexString.toString();     

       }     

            

       /**   

        * 验证口令是否合法   

        * @param password   

        * @param passwordInDb   

        * @return   

        * @throws NoSuchAlgorithmException   

        * @throws UnsupportedEncodingException   

        */   

       public static boolean validPassword(String password, String passwordInDb)     

               throws NoSuchAlgorithmException, UnsupportedEncodingException {     

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

           byte[] pwdInDb = hexStringToByte(passwordInDb);     

           //声明盐变量     

           byte[] salt = new byte[SALT_LENGTH];     

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

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

           //创建消息摘要对象     

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

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

           md.update(salt);     

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

           md.update(password.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;     

           }     

       }     

      

      

       /**   

        * 获得加密后的16进制形式口令   

        * @param password   

        * @return   

        * @throws NoSuchAlgorithmException   

        * @throws UnsupportedEncodingException   

        */   

       public static String getEncryptedPwd(String password)     

               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(password.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);     

       }     

   }   
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-22 15:34 , Processed in 0.419325 second(s), 48 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表