MD5加密算法

今天建民老师讲解了系统的安全性问题,涉及了MD5加密算法,之前只是使用过几次,没有特别了解,我上网查询了相关的资料,做一下总结。

MD5的作用

①一致性检验。

②数字签名。

③安全访问认证,这个就是平时系统设计的问题了。

在用户注册时,会将密码进行md5加密,存到数据库中。这样可以防止那些可以看到数据库数据的人,恶意操作了

md5是唯一的吗?

md5作为数据库中的主键可行吗?这就涉及到一个问题,md5值是唯一的吗?答案是,不唯一。

也就是一个原始数据,只对应一个md5值;

但是一个md5值,可能对应多个原始数据。

md5不能破解吗?

md5是不可逆的,也就是没有对应的算法,从生产的md5值逆向得到原始数据。

但是如果使用暴力破解,那就另说了。

md5特点:

1.长度固定:

不管多长的字符串,加密后长度都是一样长。

作用:方便平时信息的统计和管理。

2.易计算:

字符串和文件加密的过程是容易的。

作用: 开发者很容易理解和做出加密工具。

3.细微性

一个文件,不管多大,小到几k,大到几G,你只要改变里面某个字符,那么都会导致MD5值改变。

作用:很多软件和应用在网站提供下载资源,其中包含了对文件的MD5码,用户下载后只需要用工具测一下下载好的文件,通过对比就知道该文件是否有过更改变动。

4.不可逆性

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

作用:基于这个特点,很多安全的加密方式都是用到.大大提高了数据的安全性。

Java的MD5加密算法:

 

import java.security.MessageDigest;

public class TestMD5 {
// MD5加密。32位   
public static String str_toMD5(String inStr) {
    MessageDigest md5 = null;
    try {
            md5 = MessageDigest.getInstance("MD5");
    } catch (Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
            return "";
    }
    char[] charArray = inStr.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);
    StringBuffer hexValue = new StringBuffer();
    for (int i = 0; i < md5Bytes.length; i++) {
        int val = ((int) md5Bytes[i]) & 0xff;
        if (val < 16)
        hexValue.append("0");
        hexValue.append(Integer.toHexString(val));
    }
    return hexValue.toString();
}

// 可逆的加密算法   
public static String en_al(String inStr) {
    char[] a = inStr.toCharArray();
    for (int i = 0; i < a.length; i++) {
        a[i] = (char) (a[i] ^ 't');
    }
    String s = new String(a);
    return s;
}

// 加密后解密   
public static String JM(String inStr) {
    char[] a = inStr.toCharArray();
    for (int i = 0; i < a.length; i++) {
        a[i] = (char) (a[i] ^ 't');
    }
    String k = new String(a);
    return k;
}

public static void main(String[] args) {
    String s = new String("123456"); 
    System.out.println("原始:" + s); 
    System.out.println("MD5后:" + str_toMD5(s)); 
    System.out.println("MD5后再加密:" + en_al(str_toMD5(s))); 
    System.out.println("解密为MD5后的:" + JM(en_al(str_toMD5(s))));
}
}

 借鉴于https://blog.csdn.net/love_moon821/article/details/79843845

posted on 2020-02-27 16:46  宥宁  阅读(851)  评论(0编辑  收藏  举报

导航