java.security.MessageDigest的使用之生成安全令牌!

  时候,我们需要产生一个数据,这个数据保存了用户的信息,但加密后仍然有可能被人使用,即便他人不确切的了解详细信息...

好比,我们在上网的时候,很多网页都会有一个信息,是否保存登录信息,以便下次可以直接登录而不必再次输入账户,密码等...而通常这样需要Cookie保存用户信息,当然,这个信息是加密信息,且一般都加了时间戳等验证信息的...

    登陆时,读取cookie,解析cookie的信息,以及如时间戳等附加信息.如果没有时间戳...那么任何人只要有这个cookie,复制cookie到他的电脑中,然后登陆相同的页面,即便盗用者并不知道用户的信息是什么,也能登陆...

所以,时间戳就类似我们所说的安全令牌.

    方式,将用户信息MD5加密后,再将时间戳MD5加密,然后按照特定的处理,将加密后的用户信息以及时间戳,ip地址等信息再次处理,加密后,生成cookie保存客户端...这样就避免了前面所说的安全问题...

    Java.security.MessageDigest,在创建安全令牌上,比MD5更简便.因为update方法!!!

 

[java] view plain copy
 
  1. package cn.vicky.utils;  
  2.   
  3. import java.security.MessageDigest;  
  4. import java.security.NoSuchAlgorithmException;  
  5.   
  6. /** 
  7.  * 令牌处理器 
  8.  *  
  9.  * @author Vicky 
  10.  * @emial eclipser@163.com 
  11.  *  
  12.  */  
  13. public class TokenProcessor {  
  14.   
  15.     private static TokenProcessor instance = new TokenProcessor();  
  16.   
  17.     private long previous;  
  18.   
  19.     protected TokenProcessor() {  
  20.     }  
  21.   
  22.     public static TokenProcessor getInstance() {  
  23.         return instance;  
  24.     }  
  25.   
  26.     public synchronized String generateToken(String msg, boolean timeChange) {  
  27.         try {  
  28.   
  29.             long current = System.currentTimeMillis();  
  30.             if (current == previous)                current++;   
  31.             previous = current;   
  32.             MessageDigest md = MessageDigest.getInstance("MD5");  
  33.             md.update(msg.getBytes());  
  34.             if (timeChange) {  
  35.                 // byte now[] = (current+"").toString().getBytes();  
  36.                 byte now[] = (new Long(current)).toString().getBytes();  
  37.                 md.update(now);  
  38.             }  
  39.             return toHex(md.digest());  
  40.         } catch (NoSuchAlgorithmException e) {  
  41.             return null;  
  42.         }  
  43.     }  
  44.   
  45.     private String toHex(byte buffer[]) {  
  46.         StringBuffer sb = new StringBuffer(buffer.length * 2);  
  47.         for (int i = 0; i < buffer.length; i++) {  
  48.             sb.append(Character.forDigit((buffer[i] & 240) >> 4, 16));  
  49.             sb.append(Character.forDigit(buffer[i] & 15, 16));  
  50.         }  
  51.   
  52.         return sb.toString();  
  53.     }  
  54. }  

 

测试

 

[java] view plain copy
 
  1. @Test  
  2.     public void testGenerateToken(){  
  3.           
  4.         String token = new TokenProcessor().generateToken("Vicky",true);  
  5.           
  6.         System.err.println(token);  
  7.   
  8.         String token2 = new TokenProcessor().generateToken("Vicky",false);  
  9.           
  10.         System.err.println(token2);  
  11.     }  
  12.       

 

执行后打印:

69ff8ae72232da59a613ecc830ed7c7a
020c290593cef84aeac4ea2c269d326d

再次执行打印:

d8e38257652deaa76de81c8225801482
020c290593cef84aeac4ea2c269d326d

可见,第1打印的数据,是一直变换的.因为他加入了时间戳

而第2条打印的数据却是不变的,因为他只是简单的MD5加密

posted @ 2017-05-11 15:15  邱明成  阅读(1236)  评论(0编辑  收藏  举报