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条评论
点击登录参与评论