1. 程式人生 > >一個隨機數發生器 用於在服務器和客戶機直接進行安全性驗證的類

一個隨機數發生器 用於在服務器和客戶機直接進行安全性驗證的類

提供服務 instance dig ext 隨機 個數 相關 algorithm sso

在服務器向客戶端提供服務時 有可能頁面遭到了修改 但是服務器無法進行驗證用戶提交的頁面是否

是自己服務器發送頁面 那麽就可以采用一個隨機函數發生器 發送一個字符給客戶機 在客戶機提交數據

時進行驗證 是否是自己提供的頁面 我們可以采取隨機數的方式進行這個任務

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);
    }

}

一個隨機數發生器 用於在服務器和客戶機直接進行安全性驗證的類