java使用MD5加盐加密

废话不多说,直接上代码,主要代码已经加注释

package com.shop.utils;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;


import org.apache.tomcat.util.codec.binary.Base64;

import com.shop.domain.User;
/*
 * 实现MD5加盐加密与解密
 */
public class SecurityTool {
	private static MessageDigest md5;//md5加密对象
	private static Base64 base64;//加密编码对象
	private static final int saltLen = 15;//盐长度
	private static String salt = "";//盐
	
	static{
		try {
			md5 = MessageDigest.getInstance("MD5");//获取MD5加密对象
			base64 = new Base64();//获取加密编码对象
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
	/*
	 * 对password进行MD5加盐加密,返回加密过的password,并存储盐salt
	 */
	public static void encrypt(User user){
		Random random = new Random();
		String str = "qwertyuiopasdfghjklzxcvbnm1234567890+-=*;',.";
		for(int i=0;i<saltLen;i++){
			salt += String.valueOf(str.charAt(random.nextInt(str.length())));//从str中随机获取字符生成长度为saltLen的加密盐
		}
		String passwordSalt = user.getPassword() + salt;//将密码和盐拼接到一起
		System.out.println(passwordSalt);
		try {
			md5.reset();//初始化
			System.out.println(passwordSalt.getBytes("UTF-8"));
			md5.update(passwordSalt.getBytes("UTF-8"));//将加盐密码传给消息摘要对象
			byte[] bys=md5.digest();//创建消息摘要对象
			byte[] lastPassword=base64.encode(bys);//进行加密
			user.setPassword(new String(lastPassword));
			user.setSalt(salt);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
	/*
	 * 用于登录时密码验证
	 * 根据用户输入的未加密密码和用户的盐进行解密(实际上同样是MD5加密,只不过加密结果用来判断与数据库中的加密密码是否相同)
	 * 返回解密结果
	 */
	public static String deciphering(String password,User user){
		String passwordSalt = password + user.getSalt();//将密码和盐拼接到一起
		System.out.println(passwordSalt);
		String lastPassword = "";
		try {
			md5.reset();//初始化
			System.out.println(passwordSalt.getBytes("UTF-8"));
			md5.update(passwordSalt.getBytes("UTF-8"));//将加盐密码传给消息摘要对象
			byte[] bys=md5.digest();//创建消息摘要对象
			byte[] lastPasswordStr=base64.encode(bys);//进行加密
			lastPassword = new String(lastPasswordStr);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return lastPassword;
	}
}

注意:最后要通过new String(lastPasswordStr)将加密后的密码转成字符串(自己基础不扎实,一开始使用lastPasswordStr.toString(),结果导致同样的字符串加密后得到不同的结果,实际上lastPasswordStr.toString()获取到的是byte[] lastPasswordStr数组的地址,因此每次加密分配的地址块都不同。所以,写下此文章警示自己)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值