MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

这波解释是不是很正经严肃,好像看懂了,但是如果有人问MD5是什么,MD5就是...就是小编也不知道,通俗一点MD5是一种算法,用于数据的安全方面对数据进行加密和解密,虽然MD5被认为不安全,而且渐渐被AES所取代,但是对于一般的情况下使用时可以的,例如某个管理后台的账号密码加密,普通的HTTP请求签名,数据库存储的一些重要数据加密,在这小编就说一下MD5在Java上的使用。

在JDK内部集成多种算法,包括MD5和AES等,那MD5在Java上的使用就非常简单了,默认的加密是小写的,如下

知道你们这些懒人肯定要可以复制的源码,小编会在最后附上整个工具类的源码的,默认的加密就是生成小写,但是如果想要使用大写也非常简单,就是使用,自定义一个数组,代码如下

下面附上整个工具类的源码,小编哪里有写的不好或者有错误,希望大家能留言指出

import org.apache.commons.codec.binary.Hex;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.Random;

/**

* @date 2019/9/16 10:30

*/

public class MD5Utils {

/**

* 字符串MD5(小写+字母)

*

* @param str 要进行MD5的字符串

*/

public static StringgetStrMD5(String str) {

// 获取MD5实例

MessageDigest md5 =null;

try {

md5 = MessageDigest.getInstance("MD5");

}catch (NoSuchAlgorithmException e) {

e.printStackTrace();

System.out.println(e.toString());

return "获取MD5实例异常";

}

// 将加密字符串转换为字符数组

char[] charArray = str.toCharArray();

byte[] byteArray =new byte[charArray.length];

// 开始加密

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

byteArray[i] = (byte) charArray[i];

byte[] digest = md5.digest(byteArray);

StringBuilder sb =new StringBuilder();

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

int var = digest[i] &0xff;

if (var <16)

sb.append("0");

sb.append(Integer.toHexString(var));

}

return sb.toString();

}

/**

* 字符串MD5(大写+字母)

*

* @param password 要进行MD5的字符串

*/

public static StringgetStrrMD5(String password) {

char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

try {

byte strTemp[] = password.getBytes("UTF-8");

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

mdTemp.update(strTemp);

byte md[] = mdTemp.digest();

int j = md.length;

char str[] =new char[j *2];

int k =0;

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

byte byte0 = md[i];

str[k++] = hexDigits[byte0 >>>4 &15];

str[k++] = hexDigits[byte0 &15];

}

return new String(str);

}catch (Exception e) {

return null;

}

}

/**

* 加盐MD5

*/

public static StringgetSaltMD5(String password) {

// 生成一个16位的随机数

Random random =new Random();

StringBuilder sBuilder =new StringBuilder(16);

sBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999));

int len = sBuilder.length();

if (len <16) {

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

sBuilder.append("0");

}

}

// 生成最终的加密盐

String Salt = sBuilder.toString();

password =md5Hex(password + Salt);

char[] cs =new char[48];

for (int i =0; i <48; i +=3) {

cs[i] = password.charAt(i /3 *2);

char c = Salt.charAt(i /3);

cs[i +1] = c;

cs[i +2] = password.charAt(i /3 *2 +1);

}

return String.valueOf(cs);

}

/**

* 验证加盐后是否和原文一致

* @param password  md5原文

* @param md5str    加盐md5后的md5串

*/

public static boolean getSaltverifyMD5(String password, String md5str) {

char[] cs1 =new char[32];

char[] cs2 =new char[16];

for (int i =0; i <48; i +=3) {

cs1[i /3 *2] = md5str.charAt(i);

cs1[i /3 *2 +1] = md5str.charAt(i +2);

cs2[i /3] = md5str.charAt(i +1);

}

String Salt =new String(cs2);

return md5Hex(password + Salt).equals(String.valueOf(cs1));

}

/**

* 单次加密,双次解密

*/

public static StringgetconvertMD5(String inStr) {

char[] charArray = inStr.toCharArray();

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

charArray[i] = (char) (charArray[i] ^'t');

}

String str = String.valueOf(charArray);

return str;

}

/**

* 使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转

*/

@SuppressWarnings("unused")

private static Stringmd5Hex(String str) {

try {

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

byte[] digest = md.digest(str.getBytes());

return new String(new Hex().encode(digest));

}catch (Exception e) {

e.printStackTrace();

System.out.println(e.toString());

return "";

}

}

public static void main(String[] args) {

System.out.println(getSaltMD5("admin"));

System.out.println(getSaltverifyMD5("admin","092956b6b61a40a011f3076c650194991954f3584fa92220"));

System.out.println(getconvertMD5("admin"));

System.out.println(getconvertMD5(getconvertMD5("admin")));

}

}

补充说明:

MD5加密算法为现在应用最广泛的哈希算法之一,该算法广泛应用于互联网网站的用户文件加密,能够将用户密码加密为128位的长整数。数据库并不明文存储用户密码,而是在用户登录时将输入密码字符串进行MD5加密,与数据库中所存储的MD5值匹配,从而降低密码数据库被盗取后用户损失的风险。

MD5加密算法以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

md5 java_JAVA使用MD5加密解密相关推荐

  1. MD5 转码 实现加密解密

    import java.security.MessageDigest; import com.cplatform.util2.security.MD5; /***      * MD5加码 生成32位 ...

  2. des加密解密 代码 java_java 实现DES 加密解密的示例

    package com.cn.peitest; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.cryp ...

  3. md5等hash算法加密解密问题

    MD5(Message Digest Algorithm,中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.MD5是 Rivest 于1991年对MD4的改 ...

  4. md5 java_java中MD5函数

    import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5U ...

  5. c# 加密解密帮助类

    using System; using System.Globalization; using System.IO; using System.Security.Cryptography; using ...

  6. 白话 discuz加密解密算法,包你懂

    今天和大家分享一下discuz的加密和解密算法 研究了一个星期了, 总结了这个 算法有三个特点 1,动态性,同一字符串每次加密的密文都不一样 2,时间性,可以自己加一个限期参数,以秒为单位 3,统一性 ...

  7. 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)

    普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语言时这类可逆函数非常难搞定.所以这时尽量使用AES DES RC4 Rabb ...

  8. .net实现md5加密 sha1加密 sha256加密 sha384加密 sha512加密 des加密解密

    写项目时,后台一直用md5加密,一天群里人问,除了MD5还有其它的加密方法吗?当时只知道还有个SHA,但怎么实现什么的都不清楚,于是当网上找了下,把几种常见的加密方法都整理了下,用winform写了个 ...

  9. C# 加密解密(DES,3DES,MD5,Base64) 类

    public sealed class EncryptUtils{#region Base64加密解密/// <summary>/// Base64加密/// </summary&g ...

  10. java md5加密解密_技术09期:数据安全之加密与实现

    前言:大数据时代,每个人的生活中都不存在所谓的绝对"秘密",通过网络上的数据信息可以分析出一个人生活的各种痕迹.因此,保障大数据信息安全至关重要. 本文主要介绍了散列算法.对称加密 ...

最新文章

  1. datatable与SqlDataReader
  2. 第三次作业-介绍一款原型设计工具
  3. 《计算机科学概论(第12版)》—第0章0.3节学习大纲
  4. ASP.Net防止页面刷新重复提交
  5. 大数据分布式工作流任务调度系统DolphinScheduler v1.3.4
  6. vue 使用了浏览器的刷新之后报错_vue调试工具vue-devtools的安装
  7. RabbitMQ的深入理解和最简单的用途说明
  8. Jasperreports TextField自动换行
  9. 四叉树 gis java_GIS中四叉树索引及其分类介绍 | 麻辣GIS
  10. 很多人都不知道的如何通过银行如果最简便识别出联行号
  11. 网络安全 (九 缓冲区溢出metasploit)
  12. 反思专家型领导---转载--读后感
  13. uboot 下mmc read/write命令使用和验证方法
  14. Java数据结构--Linkedlist
  15. 管理日常工作、生活琐事的待办事项提醒工具便签
  16. PowerBuilder 跑马灯
  17. CALIPSO数据下载方法与可视化
  18. linux进入中文目录的其他方法
  19. 简单记录Java的AES128加密和解密
  20. 在数字化转型共创中,IBM重新找到成长的路径

热门文章

  1. 开源力量 Linux内核源码深度解析与开发实战
  2. html签到页面的代码,签到页面.html
  3. 接口测试用例设计 - 实战篇
  4. hilbert滤波器 matlab,用MATLAB实现Hilbert变换
  5. 基于分析Laplace方程“放射状”函数特解的基本解引入
  6. 如何把苹果手机iPhone/iPad无线投屏到MAC电脑计算机上面?
  7. 项目案例:浙江宁波江北区道路照明智慧化改造见成效
  8. AdapterView相关
  9. 平坦瑞利衰落下的QPSK性能仿真
  10. java中继承applet类_Java - 33 Java Applet基础