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