JAVA使用MD5加密解密

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位散列值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 1. ASCII 编码 ASCII(American Standard Code for Information ...
    s酸菜阅读 8,656评论 0 8
  • /**ios常见的几种加密方法: 普通的加密方法是讲密码进行加密后保存到用户偏好设置( [NSUserDefaul...
    彬至睢阳阅读 2,908评论 0 7
  • 概述 之前一直对加密相关的算法知之甚少,只知道类似DES、RSA等加密算法能对数据传输进行加密,且各种加密算法各有...
    Henryzhu阅读 3,004评论 0 14
  • #白马声慢,我自首书# 对不起后面的我爱你,是回不起的心酸,挽不回的瞬美,离人怎挽吗?不,那是我曾经送...
    妖孽异地恋阅读 241评论 0 0
  • 天气渐渐转凉了,今天晚上我找出了去年的衣服裤子,结果裤子往上一套,发现穿起来特别的紧!!!我居然又胖了(╥﹏╥)~...
    两个呆呆槑阅读 55评论 0 0