您的位置:首页 > 编程语言 > Java开发

JAVA的md5解密后导致乱码

2013-11-28 17:45 323 查看
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();
}
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: