一个随机数发生器 用于在服务器和客户机直接进行安全性验证的类

在服务器向客户端提供服务时 有可能页面遭到了修改 但是服务器无法进行验证用户提交的页面是否

是自己服务器发送页面 那么就可以采用一个随机函数发生器 发送一个字符给客户机 在客户机提交数据

时进行验证 是否是自己提供的页面 我们可以采取随机数的方式进行这个任务

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

import sun.misc.BASE64Encoder;

import com.sun.mail.util.BASE64EncoderStream;

/*
 * 这里只是希望建立一个随机数发生器 而且只允许外界调用这个随机数发生器
 * 也就是说 这个随机数发生器 不对外提供构造方法 只可以拥有一个实例
 * 外界可以通过静态方法 获取到这个随机数发生器
 */
public class TokenProcessor {
    /**********************
     * 1.把构造方法私有化
     * 2.自己创建一个实例对象
     * 3.对外暴露实例对象的获取方法
     */
    
    //1.将构造方法实例化
    private TokenProcessor(){};
    
    //2.自己创建一个
    private static final TokenProcessor instance =new TokenProcessor();
    
    //3.对外暴露一个方法 可以用于获取这个实例对象的
    public static TokenProcessor getProcessor(){
        return instance;
    }
    
    public String getGenerateString(){
        /*******************************************************
         *这里出现了一个重要的思想 服务器验证的随机数据产生问题
         *最好是一个和当前时间相关 不太可能会重复的数据 而且带有一定的随机性
         * 
         */
        String token = System.currentTimeMillis()+new Random().nextInt()+" ";
        
        try {
            /*
             * 关于messageDigest类是为应用程序提供安全信息摘要算法的功能
             * 如 MD5 或者SHA
             * 
             * 这里返回的是提供MD5算法摘要的对象
             */
            MessageDigest md=MessageDigest.getInstance("md5");
            /*这里是md5算法对象的提供者使用digest()方法 获取token
             * 这个数据的md5数组 完成哈希计算
             *  主要这里提供的数据需要先将其转化为byte[]数组
             */
            byte[] md5=md.digest(token.getBytes());
            
            /*
             * 接下来需要将字节数组数据转化为字符串 但是如果
             * 直接new String(md5); 如果没有指定会是GB2312或者ISO-8059-1
             * 这时候又存在乱码问题
             * 这时候可以采用base64编码
             */
            BASE64Encoder encoder =new BASE64Encoder();
            
            return encoder.encode(md5);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
        
    }
}

这是一个静态类 对外提供一个实例对象  可以获取到一个随机函数 进行验证时使用 在用户进行页面请求时发送随机码

在用户提交时返回这个随机码  

下面实验一下是否用

public class TokenDemo {

    public static void main(String[] args) {
        TokenProcessor tokenProcessor =TokenProcessor.getProcessor();
        String token=tokenProcessor.getGenerateString();
        System.out.println(token);
    }

}

 

posted @ 2018-05-01 16:57  coder-zhou  阅读(267)  评论(0编辑  收藏  举报