JAVA的md5解密后导致乱码

UUID:1cea62e4cf184fd99a41b89f94b4f54d
密文是:�P�<�O�֖?}(�r
明文是:abc
java代码如下:
public class Test {
	public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
		String uuid = UUID.randomUUID().toString().replace("-", "");
		System.out.println("UUID:"+uuid);
		String msg = "abc";  
//		msg += uuid;
		Test md5 = new Test();
        byte[] resultBytes = md5.eccrype(msg);
          
        System.out.println("密文是:" + new String(resultBytes));  
        System.out.println("明文是:" + msg);  
	}
	
	public static byte[] eccrype(String pwd) throws NoSuchAlgorithmException, UnsupportedEncodingException{
		MessageDigest md5 = MessageDigest.getInstance("MD5");
		byte[] srcBytes = pwd.getBytes();
		//使用srcBytes更新摘要  
	    md5.update(srcBytes); 
	    //完成哈希计算,得到result  
        byte[] resultBytes = md5.digest();
		return resultBytes;
	}
}


加密是将字节按照一定的规则进行了转换,转换后出什么样的怪字符都是正常的。
一般的做法是将加密后的byte数组转换为十六进制的字符串。
1.先为每个用户去一个不同的随机数(或者能够标示彼此不同的),加密放到数据库中 
2.将随机数解密后与重要信息(密码等)使用MD5算法进行哈希计算 
这样下来每个用户的随机数都不同,即使密码相同,生成的密码哈希也会不同。可以较大限度的减少破解。 
一般来说,密码等这样重要的信息使用单向加密(哈希算法)比较好,而手机号码、邮箱使用对称机密比较快,而且方便解密。 
3、加密的次数可以多次
public class EncryptUtil {
	//加密次数
	private static final int ENCRYPT_NUM = 5;
	public static void main(String[] args) {
		String p = "美国日本中国法国电脑桌";
		String uuid = UUID.randomUUID().toString().replace("-", "");
		uuid = "9888bcb6475f407c90191ce190a00298";
		String md5 = getMD5Str(p);
		System.out.println(getMD5Str(p));
		System.out.println("UUID:"+uuid);
		md5 = getMD5Salt(md5, uuid);
		System.out.println(md5);
		/**
		 *  ace61b4492703cdad7ffbdd5fcd420ff
			UUID:9888bcb6475f407c90191ce190a00298
			a80cfe51b012dc00eb9ecff1f9a3539c
		 */
	}
	
	/**
	 * 加上salt进行进一步的加密
	 * @param MD5
	 * @param salt
	 * @return
	 */
	public static String getMD5Salt(String MD5, String salt){
		
		for(int num = 0; num < ENCRYPT_NUM; num ++){
			MD5 += salt;
			MD5 = getMD5Str(MD5);
		}
		
		return MD5;
	}
	
	/**
	 * MD5 加密
	 */
	private static String getMD5Str(String str) {
		MessageDigest messageDigest = null;

		try {
			messageDigest = MessageDigest.getInstance("MD5");

			messageDigest.reset();

			messageDigest.update(str.getBytes("UTF-8"));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		byte[] byteArray = messageDigest.digest();

		StringBuffer md5StrBuff = new StringBuffer();

		//将加密后的byte数组转换为十六进制的字符串,否则的话生成的字符串会乱码
		for (int i = 0; i < byteArray.length; i++) {
			if (Integer.toHexString(0xFF & byteArray[i]).length() == 1){
				md5StrBuff.append("0").append(
						Integer.toHexString(0xFF & byteArray[i]));
			}else{
				md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
			}
		}

		return md5StrBuff.toString();
	}
}



  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值