MD5加密工具类(带盐值)

    我们在使用MD5加密时通常会通过加盐的方式来提高安全性,下面的示例采用的是MD5+随机盐值的方式

import org.apache.commons.lang.RandomStringUtils;
import org.springframework.util.DigestUtils;

/**
 * MD5加密工具类
 */
public class Md5Util {

    private static final Integer SALT_LENGTH = 6;

    //测试方法,比较性能
    public static void main(String[] args) {
        String content = "abc123xyz";
        long start1 = System.currentTimeMillis();
        md5Encrypt(content);
        long end1 = System.currentTimeMillis();
        long start2 = System.currentTimeMillis();
        DigestUtils.md5DigestAsHex(content.getBytes()).toUpperCase();
        long end2 = System.currentTimeMillis();
        long l = end1 - start1;
        long l1 = end2 - start2;
        System.out.println("A耗时:" + l);
        System.out.println("B耗时:" + l1);
    }

    /**
     * MD5加密
     * @param content 需要加密的明文
     * @return 密文
     */
    public static String md5Encrypt(String content) {
    	//随机生成盐值
        String salt = RandomStringUtils.random(SALT_LENGTH, true, true).toUpperCase();
        String before = salt.substring(0, 3);
        String after = salt.substring(3, SALT_LENGTH);
        String str = before + content + after;
        //MD5加密
        String md5Str = DigestUtils.md5DigestAsHex(str.getBytes()).toUpperCase();
        int space = md5Str.length() / SALT_LENGTH;
        StringBuffer md5StrBuffer = new StringBuffer(md5Str);
        int index = 0;
        char[] saleChars = salt.toCharArray();
        for (int i = 0; i < salt.length(); i++) {
            md5StrBuffer.insert(index, saleChars[i]);
            index = index + space + i;
        }
        return md5StrBuffer.toString();
    }

    /**
     * 密文验证
     * @param content 明文
     * @param md5Str 密文
     * @return true密码正确, false密码错误
     */
    public static boolean verifyPassword(String content, String md5Str) {
        int space = (md5Str.length() - SALT_LENGTH) / SALT_LENGTH;
        StringBuffer saltBuffer = new StringBuffer();
        int index = 0;
        for (int i = 0; i < SALT_LENGTH; i++) {
            String saltChar = md5Str.substring(index, index + 1);
            saltBuffer.append(saltChar);
            index = index + space + i;
        }
        String salt = saltBuffer.toString();
        String cipherText = md5Encrypt(content, salt);
        if (cipherText.equals(md5Str)) {
            return true;
        }
        return false;
    }

}

  通过测试对比会发现,该工具类的加密性能会比直接MD5加密性能低一些,请按需使用。

  如果需要高性能直接使用DigestUtils.md5DigestAsHex(content.getBytes()).toUpperCas进行MD5加密即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值