zoukankan      html  css  js  c++  java
  • 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加密

  • 相关阅读:
    python从字符串内取两个符号之间的内容
    C# 判读取得字符编码格式
    jquery:字符串(string)转json
    SQL Server 2008 SQL2012 SQL2014 收缩日志 清空删除大日志文件
    WEB 倒计时
    成功配置TOMCAT的LOG4J日志系统,格式:HTML+每天以YYYY-MM-DD.LOG命名的日志文件
    IE Error: '__doPostBack' is undefined 问题解决
    分享:JAVA和C# 3DES加密解密
    好用的linux工具
    python多线程的概念(转载)
  • 原文地址:https://www.cnblogs.com/qiumingcheng/p/6841047.html
Copyright © 2011-2022 走看看