链接:http://www.jb51.net/article/86027.htm

Java实现MD5加密及解密的代码实例分享

作者:厦门大学陈黎栋 字体:[增加 减小] 类型:转载 时间:2016-06-07我要评论

如果对安全性的需求不是太高,MD5仍是使用非常方便和普及的加密方式,比如Java中自带的MessageDigest类就提供了支持,这里就为大家带来Java实现MD5加密及解密的代码实例分享:
 

基础:MessageDigest类的使用

其实要在Java中完成MD5加密,MessageDigest类大部分都帮你实现好了,几行代码足矣:

/**
 * 对字符串md5加密
 *
 * @param str
 * @return
 */
import java.security.MessageDigest;
public static String getMD5(String str) {
 try {
 // 生成一个MD5加密计算摘要
 MessageDigest md = MessageDigest.getInstance("MD5");
 // 计算md5函数
 md.update(str.getBytes());
 // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
 // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
 return new BigInteger(1, md.digest()).toString(16);
 } catch (Exception e) {
 throw new SpeedException("MD5加密出现错误");
 }
}

进阶:加密及解密类
Java实现MD5加密以及解密类,附带测试类,具体见代码。

MD5加密解密类——MyMD5Util,代码如下

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[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++) {
 String hex = Integer.toHexString(b[i] & 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);
 }
}

测试类——Client,代码如下:

package com.zyg.security.md5;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;

public class Client {
 private static Map users = new HashMap();

 public static void main(String[] args){
 String userName = "zyg";
 String password = "123";
 registerUser(userName,password);

 userName = "changong";
 password = "456";
 registerUser(userName,password);

 String loginUserId = "zyg";
 String pwd = "1232";
 try {
 if(loginValid(loginUserId,pwd)){
 System.out.println("欢迎登陆!!!");
 }else{
 System.out.println("口令错误,请重新输入!!!");
 }
 } catch (NoSuchAlgorithmException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 } catch (UnsupportedEncodingException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 }

 /**
 * 注册用户
 *
 * @param userName
 * @param password
 */
 public static void registerUser(String userName,String password){
 String encryptedPwd = null;
 try {
 encryptedPwd = MyMD5Util.getEncryptedPwd(password);

 users.put(userName, encryptedPwd);

 } catch (NoSuchAlgorithmException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 } catch (UnsupportedEncodingException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 }

 /**
 * 验证登陆
 *
 * @param userName
 * @param password
 * @return
 * @throws UnsupportedEncodingException
 * @throws NoSuchAlgorithmException
 */
 public static boolean loginValid(String userName,String password)
 throws NoSuchAlgorithmException, UnsupportedEncodingException{
 String pwdInDb = (String)users.get(userName);
 if(null!=pwdInDb){ // 该用户存在
 return MyMD5Util.validPassword(password, pwdInDb);
 }else{
 System.out.println("不存在该用户!!!");
 return false;
 }
 }
}

PS:这里再为大家提供2款MD5加密工具,感兴趣的朋友可以参考一下:

MD5在线加密工具:

http://tools.jb51.net/password/CreateMD5Password

在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:

http://tools.jb51.net/password/hash_md5_sha

Java实现MD5加密及解密的代码实例分享的更多相关文章

  1. Java的MD5加密和解密

    链接:http://www.cnblogs.com/android-blogs/p/5305598.html Java的MD5加密和解密 简单demo: import  java.security.* ...

  2. Java生成MD5加密字符串代码实例

    这篇文章主要介绍了Java生成MD5加密字符串代码实例,本文对MD5的作用作了一些介绍,然后给出了Java下生成MD5加密字符串的代码示例,需要的朋友可以参考下   (1)一般使用的数据库中都会保存用 ...

  3. iOS,一行代码进行RSA、DES 、AES、MD5加密、解密

    本文为投稿文章,作者:Flying_Einstein(简书) 加密的Demo,欢迎下载 JAVA端的加密解密,读者可以看我同事的这篇文章:http://www.jianshu.com/p/98569e ...

  4. java 实现md5加密的三种方式与解密

      java 实现md5加密的三种方式 CreateTime--2018年5月31日15点04分 Author:Marydon 一.解密 说明:截止文章发布,Java没有实现解密,但是已有网站可以免费 ...

  5. asp.net中实现MD5加密、解密的方法

    这个MD5加密.解密的方法会使用即可. 使用时的代码备忘:Response.Write(FormsAuthentication.HashPasswordForStoringInConfigFile(& ...

  6. 使用JAVA进行MD5加密后所遇到的一些问题

    前言:这几天在研究apache shiro如何使用,这好用到了给密码加密的地方,就碰巧研究了下java的MD5加密是如何实现的,下面记录下我遇到的一些小问题. 使用java进行MD5加密非常的简单,代 ...

  7. Java实现MD5加密_字符串加密_文件加密

    Java实现MD5加密,具体代码如下: package com.bstek.tools; import java.io.FileInputStream; import java.io.IOExcept ...

  8. SELECT INTO和INSERT INTO SELECT的区别 类似aaa?a=1&b=2&c=3&d=4,如何将问号以后的数据变为键值对 C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等) C# MD5 加密,解密 C#中DataTable删除多条数据

    SELECT INTO和INSERT INTO SELECT的区别   数据库中的数据复制备份 SELECT INTO: 形式: SELECT value1,value2,value3 INTO Ta ...

  9. Java C# MD5 加密串一致性

    Java C# MD5 加密串一致性   Java public final static String md5(String s) { char hexDigits[] = { '0', '1',  ...

随机推荐

  1. 我们的GAME-TECH沙龙北京站完美收官了,都讨论了些啥?

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由 腾讯游戏云 团队首发与云+社区 摘要:4月13日,腾讯游戏云GAME-TECH游戏开发者技术沙龙于北京举办.此次活动是腾讯游戏云游戏 ...

  2. JAVA泛型——协变

    在上篇<JAVA泛型——基本使用>这篇文章中遗留以下问题,即将子类型Table或者也能添加到父类型Auction的泛型中,要实现这种功能必须借助于协变. 实验准备 现在在<JAVA泛 ...

  3. JQuery ajax-向服务器发送请求的方法

    如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法: xmlhttp.open("GET","ajax_info ...

  4. ef——存储过程

      数据库中存在存储过程GetCategory: ALTER proc [dbo].[GetCategory] @cid int as begin select * from Categories w ...

  5. Cheatsheet: 2018 01.01 ~ 02.28

    JAVA How to Improve the Performance of a Java Application Java Memory Management Writing Java Micros ...

  6. Hadoop学习笔记(10) ——搭建源码学习环境

    Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...

  7. Win7系统下网站发布IIS配置

    *本帖为个人收集贴,所有版权归:西门的后花园 http://ons.me* Technorati 标记: IIS,网站,发布,配置 一.首先是安装IIS.打开控制面板,找到“程序与功能”,点进去 二. ...

  8. 阿里java面试题,你能答对多少?

    答对以下这些面试题,可以淘汰掉 80 % 的求职竞争者. 1.hashcode相等两个类一定相等吗?equals呢?相反呢? 2.介绍一下集合框架? 3.hashmap hastable 底层实现什么 ...

  9. oracle ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2)

    工作中遇到的一个问题,需要对某列进行分组排序,取其中排序的第一条数据项 用到了ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2)来解决此问题. 实例准 ...

  10. 用js 实现代码获取下拉框的value值

    var rtl=document.getElementById("selpartyorg"); //获取下拉框对象 var id=rtl.options[rtl.selectedI ...