风也温柔

计算机科学知识库

md5算法java实现 JAVA使用MD5加密解密

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

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

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

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

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

   mons.codec..Hex;

   java..;

   java..tion;

   java.util.;

  /**

  * @date 2019/9/16 10:30

  */

   class {

  /**

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

  *

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

  */

   ( str) {

  // 获取MD5实例

   md5 =null;

  try {

  md5 = .("MD5");

  }catch (tion e) {

  e.();

  .out.(e.());

   "获取MD5实例异常";

  }

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

  char[] = str.();

  byte[] =new byte[.];

  // 开始加密

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

  [i] = (byte) [i];

  byte[] = md5.();

   sb =new ();

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

  int var = [i] &0xff;

  if (var

  sb.("0");

  sb.(.(var));

  }

   sb.();

  }

  /**

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

  *

  * @param 要进行MD5的字符串

  */

   ( ) {

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

  try {

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

   = .("MD5");

  .();

  byte md[] = .();

  int j = md.;

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

  int k =0;

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

  byte byte0 = md[i];

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

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

  }

   new (str);

  }catch ( e) {

   null;

  }

  }

  /**

  * 加盐MD5

  */

   ( ) {

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

   =new ();

   =new (16);

  .(.()).(.());

  int len = .();

  if (len

  for (int i =0; i

  .("0");

  }

  }

  // 生成最终的加密盐

   Salt = .();

   =( + Salt);

  char[] cs =new char[48];

  for (int i =0; i

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

  char c = Salt.(i /3);

  cs[i +1] = c;

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

  }

   .(cs);

  }

  /**

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

  * @param md5原文

  * @param 加盐md5后的md5串

  */

   ( , ) {

  char[] cs1 =new char[32];

  char[] cs2 =new char[16];

  for (int i =0; i

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

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

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

  }

   Salt =new (cs2);

   ( + Salt).(.(cs1));

  }

  /**

  * 单次加密,双次解密

  */

   ( inStr) {

  char[] = inStr.();

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

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

  }

   str = .();

   str;

  }

  /**

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

  */

  @("")

   ( str) {

  try {

   md = .("MD5");

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

   new (new Hex().());

  }catch ( e) {

  e.();

  .out.(e.());

   "";

  }

  }

   void main([] args) {

  .out.(("admin"));

  .out.(("admin",""));

  .out.(("admin"));

  .out.((("admin")));

  }

  }

  补充说明:

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

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

  文章来源:https://www.jianshu.com/p/1e646f3ee1a0