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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
 。n-out-of-n秘密共享要求所有参与方结合才能恢复秘密,t-out-of-n秘密共享要求至少任意t个参与方结合才能恢复秘密。从思想可以看出秘密共享算法主要又秘密分发算法和秘密重构算法组成。而秘密分发方式决定重构的方式,因此基于秘密分发,我们将秘密共享分为基于位运算的加性秘密共享和基于线性代数的线性秘密共享。

)">
下一篇>>