java MD5校验

为什么要用MD5校验

我们平时在网站上注册, 会保存用户名和密码. 但是, 究竟密码在网站后台是怎样保存的呢? 是不是直接将密码的字符串保存就行了呢? 显然这样是有安全隐患的, 万一数据库被攻破了, 所有密码就泄露了.

所以, 网站要有一个叫做MD5摘要的东西, 简单的来说, 就是通过MD5算法, 将用户设置的密码字符串转换成一个十六进制的字符串, 再将这个字符串存在数据库中.

那么, 这是不是代表着, 我们要先将密码字符串进行加密, 然后再存放呢?

也不是, 因为任何一种加密的算法, 都会有对应的解密算法. 然而MD5摘要, 只有加密, 没有解密. 他是一种使得信息量缩减的算法, 特点只在于, 使得任何两个字符串或者文件, 只要字节稍微有一点点不一样, 出来的十六机制字符串就会有很大的不同.

因此, 我们无论是比较字符串也好, 还是比较两个文件是不是同一个文件也好, 我们往往只需要比较他们的MD5摘要, 看看是不是一样的就ok了.

有些网站可能会给出字典, 你输入一个MD5码, 他会给你查到他们对应的字符串. 但是, 如果你后台的程序中, 在将用户的密码转换成MD5之前, 还做一些手脚, 比如在字符串后面添加一段固定的或者随机生成的乱码, 这样就没办法通过查字典的方法来破解了.

怎样实现从字符串到MD5字符串?

java中有现成的库, 我们可以自己建立一个工具类, 将这个库中的特定的函数包装起来就行.

package com.common.tools;

import java.security.MessageDigest;

/**
 * MD5加密工具类
 * <功能详细描述>
 * 
 * @author  chenlujun
 * @version  [版本号, 2014年10月1日]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public abstract class MD5Tools
{
    public final static String MD5(String pwd) {
        //用于加密的字符
        char md5String[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'A', 'B', 'C', 'D', 'E', 'F' };
        try {
            //使用平台的默认字符集将此 String 编码为 byte序列,并将结果存储到一个新的 byte数组中
            byte[] btInput = pwd.getBytes();

            //信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
            MessageDigest mdInst = MessageDigest.getInstance("MD5");

            //MessageDigest对象通过使用 update方法处理数据, 使用指定的byte数组更新摘要
            mdInst.update(btInput);

            // 摘要更新之后,通过调用digest()执行哈希计算,获得密文
            byte[] md = mdInst.digest();

            // 把密文转换成十六进制的字符串形式
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {   //  i = 0
                byte byte0 = md[i];  //95
                str[k++] = md5String[byte0 >>> 4 & 0xf];    //    5 
                str[k++] = md5String[byte0 & 0xf];   //   F
            }

            //返回经过加密后的字符串
            return new String(str);

        } catch (Exception e) {
            return null;
        }
    }
}

你可能感兴趣的:(java)