MD5加密工具类!!!

MD5Util工具类

  public class Md5 {
    /**
     * 十六进制下数字到字符的映射数组
     */
    private final static String[] HEX_DIGITS = {"0", "1", "2", "3", "4",
            "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};

    /**
     * md5加密算法
     * @param  originString 待加密字符串
     * @return 加密后的字符串
     */
    public static String encodeByMD5(String originString){
        if (originString != null){
            try{
                //创建具有指定算法名称的信息摘要
                MessageDigest md = MessageDigest.getInstance("MD5");
                //使用指定的字节数组对摘要进行最后更新,然后完成摘要计算
                byte[] results = md.digest(originString.getBytes());
                //将得到的字节数组变成字符串返回
                String resultString = byteArrayToHexString(results);
                return resultString.toUpperCase();
            } catch(Exception ex){
                ex.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 转换字节数组为十六进制字符串
     * @param
     * @return    十六进制字符串
     */
    private static String byteArrayToHexString(byte[] b){
        StringBuffer resultSb = new StringBuffer();
        for (int i = 0; i < b.length; i++){
            resultSb.append(byteToHexString(b[i]));
        }
        return resultSb.toString();
    }

    /** 将一个字节转化成十六进制形式的字符串     */
    private static String byteToHexString(byte b){
        int n = b;
        if (n < 0) {
            n = 256 + n;
        }
        int d1 = n / 16;
        int d2 = n % 16;
        return HEX_DIGITS[d1] + HEX_DIGITS[d2];
    }
}

测试类
在这里插入图片描述
结果
在这里插入图片描述
加密成功!!!特别简单使用,在我们保存用户信息时都需要用到Md5加密,为了增加安全性和保密性!!当然还有复杂的一些加密算法大家可以自行去研究,不过对于一般的项目来说这个够用了!!!

### 实现带加盐功能的MD5加密工具类 为了创建一个带有加盐功能的MD5加密工具类,可以遵循以下设计原则: - 使用随机数生成器来创建唯一的盐值。 - 将盐值与原始字符串连接起来再进行哈希处理。 - 返回最终的哈希结果以及用于验证时所需的盐。 下面是基于这些概念的一个简单Java实现例子[^1]: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Random; public class MD5WithSaltUtil { private static final Random RANDOM = new Random(); /** * 对输入字符串执行MD5加盐加密. */ public static String encrypt(String input) throws NoSuchAlgorithmException { byte[] saltBytes = generateSalt(); MessageDigest md = MessageDigest.getInstance("MD5"); md.update(saltBytes); byte[] digest = md.digest(input.getBytes()); StringBuilder sb = new StringBuilder(); for (byte b : digest) { sb.append(Integer.toHexString((b & 0xf0) >>> 4)); sb.append(Integer.toHexString(b & 0x0f)); } // 追加salt到hash之后返回 return sb.toString().toUpperCase() + toHexString(saltBytes).toUpperCase(); } /** * 验证给定的明文密码是否匹配已有的md5散列串(含salt) */ public static boolean verify(String plainText, String encryptedValue) throws Exception { int saltLength = 32; // Assuming the last part is always a hex string of length 32 representing the salt value String saltString = encryptedValue.substring(encryptedValue.length() - saltLength); MessageDigest md = MessageDigest.getInstance("MD5"); // Update with original salt bytes before hashing again md.update(toByteArray(saltString)); byte[] testHash = md.digest(plainText.getBytes()); StringBuilder hashBuilder = new StringBuilder(); for (byte b : testHash){ hashBuilder.append(Integer.toHexString((b & 0xf0) >>> 4)).append(Integer.toHexString(b & 0x0f)); } return hashBuilder.toString().equalsIgnoreCase(encryptedValue.substring(0, encryptedValue.length()-saltLength)); } /** Generate random salt as hexadecimal string representation.*/ private static byte[] generateSalt(){ byte[] salt = new byte[16]; RANDOM.nextBytes(salt); return salt; } /** Convert byte array into its equivalent Hexadecimal string format*/ private static String toHexString(byte[] data){ StringBuilder buffer = new StringBuilder(data.length*2); for(int i=0;i<data.length;++i){ appendHex(buffer,data[i]); } return buffer.toString(); } /** Helper method used by 'toHexString' function above */ private static void appendHex(StringBuilder buf, byte b){ buf.append(Character.forDigit((b >> 4)&0xF,16)) .append(Character.forDigit(b&0xF,16)); } /** Utility method converting from hex string back to byte[]. Used during verification process only.*/ private static byte[] toByteArray(String s){ int len=s.length()/2; byte[] result=new byte[len]; for(int i=0;i<len;i++){ result[i]=(byte)((Character.digit(s.charAt(i*2),16)<<4)+ Character.digit(s.charAt(i*2+1),16)); } return result; } } ``` 此代码片段展示了如何在一个自定义工具类`MD5WithSaltUtil`中实现基本的MD5加盐加密逻辑及其相应的校验函数。注意,在实际应用环境中应当考虑更安全的消息摘要算法如SHA-2或更高版本,并且应始终关注最新的安全性建议和最佳实践[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值