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(); } }
相关文章推荐
- 关于Java虚拟机
- Eclipse开发初阶之Eclipse安装
- 原:Myeclipse10+Egit+bitbucket实现版本控制
- java匿名内部类启动线程
- 关于Java里如何跳出一个多重循环
- eclipse 导入android源码
- java.lang.OutOfMemoryError: GC overhead limit exceeded
- 深入了解JAVA可变长度的参数(Varargs)(键人岐)
- java 读取远程HTML
- Struts2常量的具体用法实例(一)
- myeclipse 显示jdk 堆栈信息
- java Thread线程中断详情
- java.lang.IllegalArgumentException: wrong number of arguments
- java编程中'为了性能'一些尽量做到的地方
- spring整合testng和junit
- ZeroMQ(java)之I/O线程的实现与组件间的通信
- Java 单例模式详解
- struts2框架中mysql分页的策略
- java.sql.SQLException: ORA-00911: invalid character
- java jdk环境变量设置