【Java】MD5的使用

MD5,英文意思是Message Digest,即信息摘要,是常用的信息摘要算法。

它是一种不可逆的算法,也就是说,假如将一个信息MD5摘要成一串代码,将不能通过这串代码还原回原来的信息。

出于这种特性,MD5常用来校验密码是否正确、校验下载文件是否完整无损。

> 校验密码是否正确:将用户注册的密码MD5摘要后储存起来,待用户登录时将用户录入的密码MD5摘要,对比两次摘要后的信息是否相等,相等即密码正确。(这里如果加盐会更好,见后面章节)

校验下载文件是否完整无损:我们常下载开源文件资源包时,可以看到网站上提供的该资源包的MD5(比如下载POI,如图一),下载文件完毕后,可通过自己的程序或直接去一些网站上计算其MD5码,如果与官网上提供的一致,则表示文件完整无损。(图二第3行日志可见,以下程序计算的MD5码与图一的官网截图一致)

> 单纯进行MD5是否足够

如上图一可见,123456的MD5码为e10adc3949ba59abbe56e057f20f883e。

如果你的系统用MD5摘要,并且无加盐,还经常使用123456为测试密码,对这一串MD5码一定很熟悉。这一些MD5码就静静地躺在DB中待校验。

如果数据库被暴露(比如拖库),坏人得到了这些MD5码,就可以通过常用密码与其MD5码的映射关系,轻而易举地翻译出大多数密码。

所以,一般来说,我们需要对原始密码进行加盐,所谓加盐,就是按照一定规则扰乱原有字符串,然后再进行MD5摘要。这个规则,自己定义,并且一定保密。

> 调用Spring工具类获取MD5码

目前Spring应用广泛,我们就直接使用Spring的api获取MD5码了。

package com.nicchagil.md5study;

import org.springframework.util.DigestUtils;

public class MD5UtilBySpring {

    /**
     * 使用MD5作信息摘要,并以十六进制表示
     */
    public static String md5(byte[] bytes) {
        return DigestUtils.md5DigestAsHex(bytes);
    }

    /**
     * 使用MD5作信息摘要,并以十六进制表示
     */
    public static String md5(String s) {
        if (s == null || s.length() == 0) {
            return null;
        }
        return MD5UtilBySpring.md5(s.getBytes());
    }

}

package com.nicchagil.md5study;

public class Salter {

    public static final String PREFIX = "HOW";
    public static final String FILLING = "ARE";
    public static final Integer FILLING_INDEX = 5;
    public static final String POSTFIX = "YOU!";

    public static String salt(String source) {
        if (source == null || source.length() == 0) {
            return null;
        }

        StringBuffer sb = new StringBuffer(source);
        if (sb.length() > FILLING_INDEX) {
            sb.insert(FILLING_INDEX, FILLING);
        }

        return sb.insert(0, PREFIX).append(POSTFIX).toString();
    }

}

package com.nicchagil.md5study;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;

import org.junit.Test;

public class HowToUse {

    @Test
    public void test() throws Exception {
        String source = "123456";
        String md5Hex = MD5UtilBySpring.md5(source);
        System.out.println(source + "‘s hex md5 -> " + md5Hex);
    }

    @Test
    public void test2() throws Exception {
        File file = new File("d:/poi-bin-3.13-20150929.tar.gz");

        FileInputStream fis = null;
        ByteArrayOutputStream baos = null;
        try {
            fis = new FileInputStream(file);
            baos = new ByteArrayOutputStream();

            byte[] bytes = new byte[1024];
            int size = 0;
            while ((size = fis.read(bytes)) != -1) {
                if (size == 1024) {
                    baos.write(bytes);
                } else {
                    baos.write(bytes, 0, size);
                }
            }

            byte[] resultBytes = baos.toByteArray();
            System.out.println("size -> " + resultBytes.length);
            String md5Hex = MD5UtilBySpring.md5(resultBytes);
            System.out.println("Hex md5 -> " + md5Hex);
        } finally {
            if (fis != null) {
                fis.close();
            }
            if (baos != null) {
                baos.close();
            }
        }
    }

    @Test
    public void test3() throws Exception {
        String source = "123456";
        String saltSource = Salter.salt(source);
        String md5 = MD5UtilBySpring.md5(saltSource);
        System.out.println(source + " salt -> " + saltSource + " MD5 -> " + md5);

        source = "12345";
        saltSource = Salter.salt(source);
        md5 = MD5UtilBySpring.md5(saltSource);
        System.out.println(source + " salt -> " + saltSource + " MD5 -> " + md5);

        source = "1234";
        saltSource = Salter.salt(source);
        md5 = MD5UtilBySpring.md5(saltSource);
        System.out.println(source + " salt -> " + saltSource + " MD5 -> " + md5);
    }

}

图一

图二

时间: 2024-12-28 22:51:34

【Java】MD5的使用的相关文章

2015-6-8 用javascript+ Java+md5解决http协议下,用户登录明文传输密码问题

不应该说是前段时间了,就最近吧,发现公司有一个系统用的还是Http协议,当时就想了,现在都用https协议,有证书的那安全大很多啊 ,还用http不会连加密都没有吧,找了一番,果然如此,别说是传输加密了,就连后台保存到数据库的密码都没有加密,本着闲的蛋疼的想法(主要是公司大部分是业务,感觉想跳啊),于是一个毁(无)天(聊)灭(之)地(极)的计划就这样诞生了,咳咳... 好了不废话,下面说下简单的思路: 用户登录页面,获取到用户密码,用MD5加密,然后进行传输,服务器端获取的是一个加密过的密码.然

javascript md5 二次加密 和 java md5 二次加密结果不同

最近研究httpclient post 时遇到了一个问题,很费解. js  md5(str) 和 java md5(str),第一次md5 加密结果一样,(当时忽略了大小写问题,java 大写,js小写). 但是 js      md5( md5(str) ), java   md5( md5(str) ) 也就是说第二次 md5 加密确又不一样了. 当时很无语,第一次一样,第二次为什么又 不一样了呢? 原来是大小写问题,md5 加密,都是网上找的代码,第一次md5加密,java返回结果是大写,

java MD5数据加密工具类

package com.wetuo.util; import java.security.MessageDigest; /**  * 数据加密工具类  * @author wzp  *  */ public class DataUtil { public static String md5(String str) { StringBuffer buffer = new StringBuffer(); char[] chars = { '0', '1', '2', '3', '4', '5', '

Java MD5算法

JAVA MD5算法  MD5即Message-Digest Algorithm 5(信息-摘要算法5),是一种用于产生数字签名的单项散列算法. MD5算法的作用是让大容量信息在用数字签名软件签私人密匙前被"压缩"成一种保密的格式,将一个任意长度的"字节串"通过一个不可逆的字符串变换算法变换成一个128bit的大整数. 即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数.

JAVA md5算法代码

public class MD5 { /** * 签名字符串 * @param text 需要签名的字符串 * @param key 密钥 * @param input_charset 编码格式 * @return 签名结果 */ public static String sign(String text, String key, String input_charset) { text = text + key; return DigestUtils.md5Hex(getContentByte

Java MD5(字符串)

import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Utils { /* * 传入一个字符串String msg,返回Java MD5加密后的16进制的字符串结果. * 结果形如:c0e84e870874dd37ed0d164c7986f03a */ public static String getMD5(String msg) { MessageDi

js和java MD5加密

项目中用到js MD5加密和后台java MD5加密,刚开始加密后两个不一致,网上找了好久终于找到一个啦,记下来: md5.js /* * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algorithm, as defined in RFC 1321. * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. * Other co

java MD5加密工具类

1 import java.math.BigInteger; 2 import java.security.MessageDigest; 3 import java.security.NoSuchAlgorithmException; 4 5 public class MD5Utils { 6 /** 7 * 使用md5的算法进行加密 8 */ 9 public static String md5(String plainText) { 10 byte[] secretBytes = null;

java md5 数据加密

代码如下: import java.util.Scanner; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Solution { public static void main(String[] args) throws NoSuchAlgorithmException { /* Read and save the input String */ S

使用Java MD5 为文件和字符串加密

加密工具类 package com.kaige123.util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.security.MessageDigest; /** * MD5文字和文件加密<br> * http