jdk中自带MD5的使用以及加盐

  • Post author:
  • Post category:其他




JDK自带的md5算法的使用

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class test_MD5 {

    public static void main(String[] args) throws NoSuchAlgorithmException {

        String s="nihao";
        MessageDigest messageDigest=MessageDigest.getInstance("MD5");
        byte[] digest = messageDigest.digest(s.getBytes());
        for (byte b : digest) {
            System.out.print(b+" ");
            //25 76 -27 -48 -72 -100 71 -1 107 48 -65 -76 -111 -7 -36 38    -----nihao
            //-20 22 -105 -79 -114 -5 5 -40 117 21 -82 102 111 -1 -3 74     -----ni hao
        }
    }
}

是的 你没看错 这就是自带的md5算法 ,可是 有人会说 不对呀 我看其他人都还有好多代码呀 你怎么能说这就结束了呢?

首先,我们看到,其实不论s是什么,最终都变成了一个byte数组 并且被分成了16个数字。

剩下的其实就是对这些数字进行改进一下,常见的就是

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class test_MD5 {

    public static void main(String[] args) throws NoSuchAlgorithmException {

        String s="nihao";
        StringBuilder stringBuilder=new StringBuilder(32);
        MessageDigest messageDigest=MessageDigest.getInstance("MD5");
        
        byte[] digest = messageDigest.digest(s.getBytes());
        
        for (byte b : digest) {
            String s1 = Integer.toHexString(b & 0xff);//改变的地方在这里
            stringBuilder.append(s1);
        }
        System.out.println(stringBuilder.toString());
    }
}

其实就是将刚才的那些个数字变成了16进制。然后变成字符串拼接起来

这也是最常用的一种方式。



加盐

加盐就理解成一种把密码强度再度提升一下的方式。

例如 你传给我的是 nihao

那么我后台可以将nihao 和 一个固定好的字符串混合一下,例如和123qwe混合一下。

我可以这么混合:123qwenihao

我还可以这么混合:123nihaoqwe

我还可以:n123ihaqweo

我甚至还可以写一些逻辑,比如你传给我的字符串中的字符数是单数个,那么我用一种方式混合,当双数个的时候,我用另外一种方式混合,总之,就是按照一定的规律,把你传给我的东西变得复杂一点。

其实,这种方式可以发散的去想,不一定非要是和一个字符串拼接,倒置、重复等等都可以,总之,就是在原本的字符串的基础上变化一下。

举个例子:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class test_MD5 {

    public static void main(String[] args) throws NoSuchAlgorithmException {

        String s="nihao1";
        if (s.length()%2==0){//偶数
            s=s+s;
            System.out.println(s);
        }else {//奇数
            s=s.charAt(0)+s;
            System.out.println(s);
        }

        byte[] bytes = s.getBytes();

        StringBuilder stringBuilder=new StringBuilder(32);
        MessageDigest messageDigest=MessageDigest.getInstance("MD5");

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

        for (byte b : digest) {
            String s1 = Integer.toHexString(b & 0xff);
            stringBuilder.append(s1);
        }
        System.out.println(stringBuilder.toString());
    }
}

那么 我这里的加盐方式 就是 用户给我的字符数是单数的时候,进行xxxx处理,双数的时候 经行xxxx处理,然后进行md5加密操作。



测试

如果不进行加盐操作 就是单纯的 md5一下 然后换成16进制输出

nihao 对应的32位字符串的是 194ce5d0b89c47ff6b30bfb491f9dc26

我们去 https://www.cmd5.com/ 网站看看能不能被破解

在这里插入图片描述

被破解了~~

那么我们加盐试一下,加盐之后,

nihao 对应的32位字符串是 5587eee648dde1d285b18cfe2f7d819

在这里插入图片描述

没能破解



总结

真正的md5加密其实使用起来简单,但是现在安全性已经不高了,我们需要加盐 来使它的安全性变高。



版权声明:本文为m0_56356631原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。