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;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值