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

本文介绍了一种利用MD5加密及时间戳生成安全令牌的方法,用于保护用户登录信息免受非法复制。通过Java的安全MessageDigest类实现令牌生成,并提供了一个实际的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

好比,我们在上网的时候,很多网页都会有一个信息,是否保存登录信息,以便下次可以直接登录而不必再次输入账户,密码等...而通常这样需要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加密

Java中,你可以通过使用`java.security.MessageDigest`类配合`java.util.Date`来实现一个简单的token生成和加密过程。这里是一个基础的示例,展示了如何生成包含用户ID和时间戳的加密Token: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.time.Instant; import java.util.Base64; public interface TokenGenerator { String generateToken(String userId); } public class JwtTokenGenerator implements TokenGenerator { private static final String ALGORITHM = "SHA-256"; private static final long TIMESTAMP_TTL_MILLIS = 86400000; // 一天的毫秒数 @Override public String generateToken(String userId) throws Exception { Instant timestamp = Instant.now(); String timestampString = String.valueOf(timestamp.toEpochMilli()); // 合并用户ID和时间戳 String combinedData = userId + "." + timestampString; // 使用SHA-256算法对数据进行哈希 MessageDigest md = MessageDigest.getInstance(ALGORITHM); byte[] hashBytes = md.digest(combinedData.getBytes(StandardCharsets.UTF_8)); // 将哈希值转换为Base64编码的字符串 String token = Base64.getEncoder().encodeToString(hashBytes); return token; } } ``` 这个例子中,我们生成了一个Token,它包括用户的ID和当前的时间戳(以毫秒为单位),然后使用SHA-256进行哈希,最后将结果转成Base64字符串。这样做的目的是为了保证即使数据被盗取,攻击者也难以仅凭获取到的Token还原原始数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值