MD5是常用的加密方法,这里主要讲述JDK中的java.security.MessageDigest加密方式!
@Test public void testMD() { try { String username = "Vicky"; MessageDigest messageDigest = MessageDigest.getInstance("MD5"); messageDigest.update(username.getBytes()); String usernameMD5 = messageDigest.digest().toString(); System.out.println(usernameMD5); } catch (Exception e) { e.printStackTrace(); } }
打印的是:[B@107077e,这是因为输出的是byte[](messageDigest.digest()得到的是个二进制byte数组,有可能某些byte是不可打印的字符。)...我们可以使用Base64来处理byte[]
@Test public void testMD() { try { String username = "Vicky"; MessageDigest messageDigest = MessageDigest.getInstance("MD5"); messageDigest.update(username.getBytes()); System.out.println(Base64.encode(messageDigest.digest())); } catch (Exception e) { e.printStackTrace(); } }
打印的是:AgwpBZPO+ErqxOosJp0ybQ==
当然我们可以编写函数,处理二进制转hex字符串.
如:
/** * 将16位byte[] 转换为32位String * * @param buffer * @return */ private String toHex(byte buffer[]) { StringBuffer sb = new StringBuffer(buffer.length * 2); for (int i = 0; i < buffer.length; i++) { sb.append(Character.forDigit((buffer[i] & 240) >> 4, 16)); sb.append(Character.forDigit(buffer[i] & 15, 16)); } return sb.toString(); }
或者
int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } String result=new String(str);
打印:020c290593cef84aeac4ea2c269d326d,返回的是32位的字符串!!!
这样我们便可以直接使用JDK为我们提供的加密类与函数了!
MessageDigest不仅仅只为我们提供了"MD5"加密,还提供了"SHA-1"
创建的方法只为: MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
MD5与SHA-1的区别为:MD5是16位,SHA是20位(这是两种报文摘要的算法)
难道 MessageDigest 只能用作数据加密吗?如何使用MessageDigest生成安全令牌!!!