java中md5加密

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中md5加密相关的知识,希望对你有一定的参考价值。

就想知道怎么实现不想知道具体算法,用过的各位帝给些点拨
引用了什么类,具体实现方法写出来,最好上几行完整的代码~多谢~

参考技术A import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class md5
public String str;

public void md5s(String plainText)
try
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest();

int i;

StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++)
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));

str = buf.toString();
System.out.println("result: " + buf.toString());// 32位的加密
System.out.println("result: " + buf.toString().substring(8, 24));// 16位的加密
catch (NoSuchAlgorithmException e)
// TODO Auto-generated catch block
e.printStackTrace();




public static void main(String agrs[])
md5 md51 = new md5();
md51.md5s("4");//加密4


本回答被提问者采纳
参考技术B public final static String encode(String s)
char hexDigits[] =
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',
'e', 'f';
try
byte[] strTemp = s.getBytes();
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 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];

return new String(str);

catch (Exception e)
return null;



public static void main(String[] args)
System.out.print(MD5.encode("abc"));


这是把abc进行md5加密
参考技术C package com.zhuhai.global;
import java.security.*;
import java.security.spec.*;

public class Md5
public Md5()


/*
检验你的实现是否正确:
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
*/

public final static String MD5(String s)
char hexDigits[] = '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd','e', 'f';
try
byte[] strTemp = s.getBytes();
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 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];

return new String(str);

catch (Exception e)
return null;




导包后 调用加密就行
参考技术D public static String md5(String input)
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(input.getBytes("UTF-8"));
byte[] digest = md.digest();
StringBuilder sb = new StringBuilder();
for(int i=0; i < digest.length; i++)

String hex = Integer.toHexString(digest[i] & 0xff).length()==2
?Integer.toHexString(digest[i] & 0xff):0+Integer.toHexString(digest[i] & 0xff);
sb.append(hex);


return sb.toString().toUpperCase();

Java 语言实现 MD5 加密

Java 语言实现 MD5 加密


 

背景说明

在实际项目中,为了安全性考虑,经常要求账号密码是以加密后的密文形式保存到数据库中

这样,即使有人获取到了数据库中的密文密码,也不知道明文密码信息是什么,从而防止系统被恶意访问。

密码加密有很多种方式,比如:Base64DSARSAMD5SHA128SHA256SHA512等加密方式。

本文主要讲述 MD5 加密方式。


 

MD5 简介

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

MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。


 

 MD5应用

1、数据加密

利用它的单向加密性,即不可逆性,我们可以应用于数据和密码的加密

由于MD5算法的单向性,由MD5码计算出原文几乎是不可能的。目前对于这种加密方法的破解方式是收集常用的密码形式,例如生日,身份证号,电话号码等。把这些收集到的秘密用MD5处理之后进行存储,然后与需要还原的MD5进行比对,当收集的数据达到一定的数目,用户密码被破解的可能性就会变得很大。

对于这种方法,一种加强安全性的方法就是在对用户密码进行MD5处理的时候在原密码上加一个附近值,例如原密码为“password”,处理的时候变为“passworddrowssap”,经过这样的处理之后可以有效降低密码被破解的可能性。

 

2、确认文件是否被篡改

每个文件都可以计算出一个特定MD5 值

比如,我们上传一个文件到服务器上,可以同时计算出该文件对应的 MD5 值;

在文件下载的时候,通过再次计算该文件的 MD5 值。

如果两个MD5值相同,说明文件没有变化,否则,说明文件被修改过。


 

Java 语言实现 MD5 加密

通过Java编写程序,实现对任意字符串进行 MD5 加密。

1、第一版代码(初始版

代码如下:

package com.miracle.luna.md5;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * Created by Miracle Luna on 2019/11/18
 */
public class Md5UtilOriginal {

    /**
     * 将数据进行 MD5 加密,并以16进制字符串格式输出
     * @param data
     * @return
     */
    public static String md5(String data) {
        try {
            byte[] md5 = md5(data.getBytes("utf-8"));
            return toHexString(md5);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 将字节数组进行 MD5 加密
     * @param data
     * @return
     */
    public static byte[] md5(byte[] data) {
        try {
            MessageDigest md = MessageDigest.getInstance("md5");
            return md.digest(data);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return new byte[]{};
    }

    /**
     * 将加密后的字节数组,转换成16进制的字符串
     * @param md5
     * @return
     */
    private static String toHexString(byte[] md5) {
        StringBuilder sb = new StringBuilder();
        System.out.println("md5.length: " + md5.length);
        for (byte b : md5) {
            sb.append(Integer.toHexString(b & 0xff));
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        String password = "password";
        String md5HexStr = md5(password);
        System.out.println("==> MD5 加密前: " + password);
        System.out.println("==> MD5 加密后: " + md5HexStr);
    }
}

 

运行结果如下:

md5.length: 16
==> MD5 加密前: password
==> MD5 加密后: 5f4dcc3b5aa765d61d8327deb882cf99

 

2、第二版代码(精简版

代码如下:

package com.miracle.luna.md5;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * Created by Miracle Luna on 2019/11/18
 */
public class Md5UtilSimple {

    /**
     * 将数据进行 MD5 加密,并以16进制字符串格式输出
     * @param data
     * @return
     */
    public static String md5(String data) {
        StringBuilder sb = new StringBuilder();
        try {
            MessageDigest md = MessageDigest.getInstance("md5");
            byte[] md5 = md.digest(data.getBytes(StandardCharsets.UTF_8));

            // 将字节数据转换为十六进制
            for (byte b : md5) {
                sb.append(Integer.toHexString(b & 0xff));
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        String password = "password";
        String md5HexStr = md5(password);
        System.out.println("==> MD5 加密前: " + password);
        System.out.println("==> MD5 加密后: " + md5HexStr);
    }
}

 

运行结果如下:

==> MD5 加密前: password
==> MD5 加密后: 5f4dcc3b5aa765d61d8327deb882cf99

 

3、第三版代码(最终优化版

代码如下:

package com.miracle.luna.md5;

// 此处需要引入 commons-codec-1.13.jar
import org.apache.commons.codec.binary.Hex;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * Created by Miracle Luna on 2019/11/18
 */
public class Md5Util {

    /**
     * 将数据进行 MD5 加密,并以16进制字符串格式输出
     * @param data
     * @return
     */
    public static String md5(String data) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            return Hex.encodeHexString(md.digest(data.getBytes(StandardCharsets.UTF_8)));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

    public static void main(String[] args) {
        String password = "password";
        String md5HexStr = md5(password);
        System.out.println("==> MD5 加密前: " + password);
        System.out.println("==> MD5 加密后: " + md5HexStr);
    }
}

 

运行结果如下:

==> MD5 加密前: password
==> MD5 加密后: 5f4dcc3b5aa765d61d8327deb882cf99

commons-codec-1.13.jarpom 引用如下:
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.13</version>
        </dependency> 



MD5 在线加密&解密工具

1、MD5 在线加密工具

http://www.bejson.com/enc/md5/ (不仅支持 MD5加密,还支持 Base64,SHA等)

效果如下(在“加密前”后的输入框中输入需要 MD5 加密的字符串 --> 点击“MD5加密” --> 即可在“加密后”的显示显示框中看到加密后的密文):

 

2、MD5 在线解密

1) https://www.somd5.com/

效果如下(输入框中输入需要解密的 MD5 密文,点击解密即可解密 ):

 

2) https://www.cmd5.com/ (这是一款很强大的解密工具,不仅支持 MD5,还支持SHA的解密)

效果如下(在密文输入框中输入 MD5 密文,点击“解密”,即可看到 MD5 的明文):

 

解密种类众多,选择范围如下:


 

MD5 密码安全性优化

由于现在直接将密码用 MD5 算法加密存在一定的安全隐患(被暴力破解的可能性),我们可以根据实际的需要,对密码加密的过程做一些逻辑处理。

比如,如下逻辑处理:

1)password --> Base64 加密,得到加密后的密码A;

2)password --> 翻转得到drowssap --> MD5 加密,得到加密后的密码B;

3)密码A+密码B拼接 --> MD5 加密,得到加密后的密码C;

4)密码C --> 翻转操作,产生密码D,作为最终的密文密码存到数据库中。

这样可以增强密码的安全性,减少被破解的可能性。(此处具体的逻辑优化,可以根据个人喜好和实际需求,灵活定义其变换的复杂性)。  


 

【额外补充】 

当密码以 MD5 密文存入到数据库中,用户登录的时候,前端将用户输入的明文密码传输给后端。

后端程序用同样的处理逻辑对其进行 MD5 加密,用加密后的密码与数据库中该用户的密文密码比较。

如果二者相等,说明用户输入的密码正确,允许访问系统;否则,说明密码不正确,禁止访问。

 

另外,为了系统的安全性考虑防止恶意暴力尝试破解密码,我们经常限制用户输入密码错误次数

比如,连续输入3次或者5次密码,将会自动锁定账号一段时间(根据实际场景,设置锁定时长)。

 

关于 Base64 加密&解密 的Java 语言实现,请参考博客:https://www.cnblogs.com/miracle-luna/p/11128734.html

 

希望能帮到大家,谢谢!

以上是关于java中md5加密的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中简单的MD5加密类(MD5Utils)

Java——MD5密码加密

.net(md5)加密汉字的结果与java(md5)加密汉字的结果不一样。。。

java加密算法小结--MD5加密算法

java加密算法小结--MD5加密算法

Java 自带的加密类MessageDigest(加密MD5和SHA)