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

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

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

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

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

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

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

测试

  1. @Test
  2. public void testGenerateToken(){
  3. String token = new TokenProcessor().generateToken("Vicky",true);
  4. System.err.println(token);
  5. String token2 = new TokenProcessor().generateToken("Vicky",false);
  6. System.err.println(token2);
  7. }

执行后打印:

69ff8ae72232da59a613ecc830ed7c7a
020c290593cef84aeac4ea2c269d326d

再次执行打印:

d8e38257652deaa76de81c8225801482
020c290593cef84aeac4ea2c269d326d

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

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

最新文章

  1. 使用 MySQL 查找附近的位置
  2. Go语言并发编程示例 分享(含有源代码)
  3. PHP程序设计
  4. 使用SDWebImage下载图片,sharedDownloader方法下载成功,new 方法下载失败
  5. centos7 服务管理
  6. easyui datagrid 仿ext—右键
  7. OpenLDAP与phpldapadmin的搭建
  8. install 命令用法详解
  9. Lua表的构造及遍历
  10. Deployed component GUIs and figures have different look and feel than MATLAB desktop
  11. android 68 单元测试
  12. Linux2.6内核--VFS层中和进程相关的数据结构
  13. CSS样式总结
  14. ajax系列之用jQuery的ajax方法向服务器发出get和post请求
  15. NASPhoto Station不只是储存的强大照片管理功能
  16. 如何在vue里面访问php?
  17. 关于requestAnimationFrame与setInterval的一点差异
  18. 模拟poj1350
  19. 数字图像处理的Matlab实现(1)—绪论
  20. eclipse的安装及使用

热门文章

  1. 工作中的Buff加成-结构化思考力:自创独门武功 3-3-3原则
  2. MongoDB高级知识-易扩展
  3. 5个Shell脚本编程入门练习例子
  4. Spring Cloud使用总结
  5. Eclipse搭建Android开发环境(安装ADT,Android4.4.2)
  6. 理解图像Garbor和HOG特征的提取方法及实例应用
  7. windows测试登陆
  8. 多继承c3算法
  9. UITabBarController的属性
  10. ubuntu15.04下安装jdk8