基础: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;

}

}

}

更多Java实现MD5加密及解密的代码实例分享相关文章请关注PHP中文网!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php md5加密 java代码_Java实现MD5加密及解密的代码实例分享相关推荐

  1. md5 算法java实现_java实现MD5算法

    import java.security.MessageDigest; /** 加密工具* @author 刘彦青 * **/ public class EncryptUtil { /** MD5加密 ...

  2. [转]DES加密 java与.net可以相互加密解密两种方法

    [转]原文地址:http://jumpman.javaeye.com/blog/605996 DES加密 java与.net可以相互加密解密两种方法 文章分类:Java编程 通过这个方法可以实现jav ...

  3. java中md5怎么实现的_java中md5算法的实现

    /** * MD5的算法在RFC1321 中定义 * 在RFC 1321中,给出了Test suite用来检验你的实现是否正确: * MD5 ("") = d41d8cd98f00 ...

  4. java数据加密解密代码_java使用RSA加密方式实现数据加密解密的代码

    RSA的应用 RSA是一种非对称加密算法.现在,很多登陆表单的密码的都采用RSA加密,例如京东中的登陆使用公钥对密码进行加密 java使用RSA加密方式实现数据加密解密,需要首先产生私钥和公钥 测试代 ...

  5. java分装_Java ——Number Math 类 装箱 拆箱 代码块

    本节重点思维导图 当需要使用数字的时候,我们通常使用内置数据类型,如:byte.int.long.double 等 int a = 5000;float b = 13.65f;byte c = 0x4 ...

  6. java手机验证码登录代码_java web实现手机短信验证码登录实例

    运行环境 jdk7+tomcat7 项目技术(必填) Servlet+Ajax+Bootstrap 数据库文件 我这里没用到数据库,比较简单,如果需要用到数据库不会的话可以私信我或者加我QQ jar包 ...

  7. md5加密 java原理_md5 32位 加密原理 Java实现md5加密

    md5 32位 加密原理 简单概括起来,MD5 算法的过程分为四步:处理原文,设置初始值,循环加工,拼接结果. 第一步:处理原文 首先,我们计算出原文长度(bit)对 512 求余的结果,如果不等于 ...

  8. java微信支付代码_Java微信支付之服务号支付代码示例

    Java微信支付之服务号支付实现,网上的java微信支付sdk和Demo基本上是水的,看着头疼所以我决心自己开始写Java微信支付之公众号支付,多的不说见下面源码,为了方便使用我分别用了两个Servl ...

  9. core java 9 代码_Java Core 学习笔记——3.char/Unicode/代码点/代码单元

    通用字符集(UCS) UCS是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所制定的标准字符集. UCS包括了其他所有的字符集(包含了已知语言的所以字符). ISO/IEC 1 ...

最新文章

  1. 牛客练习赛81 小Q与彼岸花 (分块+可持久化01trie)
  2. asp.net core 2使用本地https证书
  3. python function if yield_Python中的yield关键字
  4. 基于用例点来度量软件规模并管理进度 之二
  5. 列表-使用del关键字从列表删除数据
  6. 人人网 6.0 版申请页面随着滚动条拖动背景图片滚动出现,具体使用 JavaScript 和 CSS 原理是什么?...
  7. Mysql字符串截取 mysql将字符串字段转为数字排序或比大小
  8. 分页插件--根据Bootstrap Paginator改写的js插件
  9. c++11特性move和forward区别
  10. 什么是base64编码
  11. 提升UI设计界面高级感的小技巧
  12. Getting Started with Processing 第五章的easing问题(2)
  13. Fibonacci算法
  14. 「数字电路系列」博文目录,学习总结
  15. 清华大学计算机系2016名单,清华大学2016年自主招生北京考生入选名单汇总
  16. 关键字:c++builder(BCB) C# WebService EAccessViolation
  17. java jks 转pfx_JKS、BKS、PFX证书格式之间转换
  18. 【基于贪心的树型动态规划】【NOI2007】追捕盗贼
  19. 自适应中值滤波器python实现
  20. 剑指offer--序列化与反序列化二叉树(先序递归,建树)

热门文章

  1. VIM的一些自己的使用tips(5年前整理的,看到后热泪盈眶)
  2. 煽情的儿子550=随笔
  3. u盘文件打不开如何解决?恢复U盘,看这些实用方案
  4. 第三方服务器获取微信公众号图文消息
  5. Datawhale打卡任务 Task 05爬虫入门与综合应用
  6. Ubuntu 15 安装搜狗输入法
  7. 图文教程:教你快速生成实体店电子优惠券
  8. 情态动词---情态动词表推测的三种时态
  9. 什么是单标签和双标签,有何区别。
  10. 东莞1号线莞太路站主体结构封顶