md5加密算法

md5是什么?

md5是一种信息摘要算法(message-digest algorithm 5 ),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用来确保信息传输完整一致性。

特点

  • 不可逆

                知道密文和加密方式,无法反向计算出原密码

                但是有md5破解网站,专门查询MD5码

撞库:原理是:通过建立大型的数据库,把日常的各种句子通过md5加密成为密文,不断积累更新大量句子,放在庞大的数据库里;然后,有人拿了别人的密文,想查询真实的密码,就需要把密文拿到这个数据库的网站(免费MD5加密解密:https://md5.cn/)去查询。

  • 长度固定

        任意长度的数据,算出来的md5值长度都是固定的

  • 强抗碰撞

        想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。

  • 容易计算

        原理通俗易懂

  • 细微性(高度离散性)

       对原数据进行任何改动,都会有很大的变化

               

md5的用途

1.防止看到明文 

        因为密码存储到数据库后已经被加密了,即使不法分子拿到数据库中存储的用户密码的值,也无法知道正确的密码。

2.防止抵赖(数字签名)

        将文件加密,传输一个MD5值,如果被修改文件中的内容,对文件重新计算发现md5值不一致,证明中途被篡改。

3.文件上传

4.文件完整性验证

http://t.csdn.cn/Jq1SD

md5加盐

密码+salt值(salt值可以是随机字符串) 再加密

如:密码为123 特定字符串abc        用“12345abc”这个字符串加密

原理

获取md5对象,将目标字符串转换成字节数组,byte[] md5Bytes = md5.digest(byteArray);将字节数组加密,若字节数组长度小于16,转换成字符串StringBuffer,使用append做补0操作。

1.获取信息摘要对象:md5

通过信息摘要单例的构造函数获取:

MessageDigest md5 = MessageDigest.getInstance("MD5");

2.信息摘要对象是对字节数组进行摘要的,所以先获取字符串的字节数组.

byte[] bytes = str.getBytes();

3.信息摘要对象(md5)对字节数组进行摘要,得到摘要字节数组:

byte[] digest = md5.digest(bytes);

4.把摘要数组中的每一个字节转换成16进制,并拼在一起就得到了MD5值. 


原文链接:http://t.csdn.cn/MP7LA

实现

package com.org.code;

import java.security.MessageDigest;

public class EncodeMD5 {

    public static String string2MD5(String str){
        MessageDigest md5 = null;
        try{
            md5 = MessageDigest.getInstance("MD5");//获取加密算法对象
        }catch (Exception e){
            System.out.println(e.toString());
            e.printStackTrace();
            return "";
        }
      //将目标字符串转换成字节数组
        char[] charArray = str.toCharArray();
        byte[] byteArray = new byte[charArray.length];

        for (int i = 0; i < charArray.length; i++)
            byteArray[i] = (byte) charArray[i];
    	
      //将字节数组加密
        byte[] md5Bytes = md5.digest(byteArray);//对字节数组进行摘要
        //用keystr.append  字符串定义时需要用可变的字符串StringBuffer
        StringBuffer haxValue = new StringBuffer();
        for (int i = 0; i < md5Bytes.length; i++){
            //0xff是16进制数,这个刚好8位都是1的二进制数,而且转成int类型的时候,高位会补0
            int val = ((int) md5Bytes[i]) & 0xff;//转换成16进制
//在&正数byte值的话,对数值不会有改变 在&负数数byte值的话,对数值前面补位的1会变成0,
            if (val < 16){
                haxValue.append("0");//位数不够,高位补0
            haxValue.append(Integer.toHexString(val));
        }
        return haxValue.toString();
    }
    public static void main(String[] args) {
        String s = "humane_";
        System.out.println("原始:" + s);
        System.out.println("MD5后:" + string2MD5(s));
    }
}

应用

用户注册——密码加密存储

//调用EncodeMD5中的方法
String password2 =EncodeMD5.string2MD5(password);
//直接存储加密后的字符串
user.setPassword(password2);

用户登录——通过加密规则转换成密文后在跟数据库中存在的密码比对。

//将表单得到的密码加密
String password = request.getParameter("password");
String password2=EncodeMD5.string2MD5(password);
//拿到数据库中存储的密码与现输入的密码比对
User user =UserDAOFactory.getUserDAO().findUser(username);
if(user.getPassword().equals(password2)){//相等就跳转到首页
    response.sendRedirect("index.jsp");
}

 来源于:

百度安全验证

http://t.csdn.cn/To3q8

http://t.csdn.cn/v6Cnm

http://t.csdn.cn/MP7LA

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值