2023-05-23 18:00

常用MD5加密工具类

王姐姐

JavaEE

(460)

(0)

收藏

1 简单的MD5加密工具类

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
    public static String hash(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] messageDigest = md.digest(input.getBytes());
            BigInteger no = new BigInteger(1, messageDigest);
            String hashText = no.toString(16);
            while (hashText.length() < 32) {
                hashText = "0" + hashText;
            }
            return hashText;
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
}

该工具类使用了Java标准库中的MessageDigest类实现MD5加密。首先,获取一个MessageDigest对象,指定算法为MD5;接着,将输入数据转换成字节数组,通过md.digest()方法计算哈希值;最后,转换成16进制字符串表示返回。

MD5哈希算法本身是不可逆的,也就是说无法从哈希值得出原始数据内容,因此常用于密码等敏感数据的加密存储。使用该工具类可以方便地对输入的字符串进行MD5加密处理:

String input = "password";
String hashText = MD5Utils.hash(input);
System.out.println(hashText);

输出结果为:

5f4dcc3b5aa765d61d8327deb882cf99

可以看到,将"password"字符串加密后得到的哈希值是一个32位的16进制字符串,具有唯一性和不可逆性。

2 安全的MD5加密工具类

以下是一个使用Java语言实现的更安全的MD5加密工具类,该类实现了Salt值加盐和多次迭代的功能,可以有效防止暴力破解。

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class MD5Util {
    private static final String ALGORITHM = "MD5";
    private static final int ITERATIONS = 10000;
    private static final int SALT_BYTE_SIZE = 16;
    public static String generateSecurePassword(String password, byte[] salt) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance(ALGORITHM);
        md.reset();
        md.update(salt);
        byte[] hash = md.digest(password.getBytes());
        for (int i = 0; i < ITERATIONS; i++) {
            md.reset();
            hash = md.digest(hash);
        }
        StringBuilder sb = new StringBuilder();
        for (byte b : hash) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
    public static byte[] generateSalt() throws NoSuchAlgorithmException {
        SecureRandom random = new SecureRandom();
        byte[] salt = new byte[SALT_BYTE_SIZE];
        random.nextBytes(salt);
        return salt;
    }
}

上述代码中,generateSecurePassword方法接收用户输入的明文密码和生成的Salt盐值,使用MessageDigest类对盐值和密码进行多次迭代的MD5哈希,从而生成最终加密后的密码。generateSalt方法使用SecureRandom类生成随机的Salt盐值。

3 指定加密次数和salt盐的安全灵活的MD5加密工具类

MD5加密算法,可以指定加密次数和盐,代码如下:

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

public class MD5Util {
    
    public static String encrypt(String password, String salt, int iterations) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update((password + salt).getBytes());
        byte[] bytes = md.digest();
        for (int i = 0; i < iterations - 1; i++) {
            md.reset();
            bytes = md.digest(bytes);
        }
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

}


调用时,可以通过传递第二个参数来指定加密次数,例如

    
    public static void main(String[] args) throws NoSuchAlgorithmException {
        String password = "password";
        String salt = "salty";
        int iterations = 3;
        String encryptedPassword = encrypt(password, salt, iterations);
        System.out.println(encryptedPassword);
    }


0条评论

点击登录参与评论