1. 程式人生 > >基於層次分析法的資訊保安風險評估量化法的研究報告

基於層次分析法的資訊保安風險評估量化法的研究報告

沒想到小組題目會成為第一篇文章。寫得不好請見諒
選取的是算是最簡單的基於層次分析法的模型,說它簡單因為有現成的層次分析法軟體yaahp,簡單明瞭容易上手。
先附上yaahp9.0連結:http://pan.baidu.com/s/1pKLUR03 解壓後安裝
主要參考文獻:
基於層次分析法的資訊保安風險評估量化方法研究_李鵬宇
基於層次分析法的資訊保安風險評估應用研究_趙越

一個是層次分析法的模型,一個是基於層次分析法結合模糊理論的擴充套件模型。
首先我們介紹風險,它存在兩個屬性:導致的損失和發生的可能性。
風險對組織的影響也就是兩個屬性權衡的結果,因此通過對系統的資產、威脅、脆弱性評估,計算威脅利用脆弱性導致安全事件發生的可能性以及評估安全事件發生對資產造成的損害程度,就可以計算出系統的風險。
其計算原理就描述為 R=f(A, V, T)
其中:R代表風險,A代表資產,V代表脆弱性,T代表威脅

層次分析法(Analytic Hierarchy Process,簡稱 AHP)。它是一種定量與定性相結合的綜合性分析方法,核心是將複雜的問題進行層次化,將原問題簡單化並在層次基礎上進行分析;它把決策者的主觀判斷量化,以數量形式進行表達和處理,通過定量形式的資料將定性和定量分析相結合從而幫助決策者進行決策。
層次分析法的基本原理是把要決策的問題看成是由很多影響因素組成的一個大系統,這些因素之間在一定程度上是相互關聯和制約的,而且這些因素根據彼此之間的隸屬關係可以組合成若干個層次,再利用相關數學方法對各個因素層進行排序,最後通過對排序結果的分析來輔助決策。
層次分析法分為四個步驟

:(1)建立層次結構;(2)構造各層次間的兩兩對比較判斷矩陣;(3)計算單個矩陣的權重向量;(4)計算各層元素對目標層的合成權重向量。

(1)首先我們要對目標問題進行剖析,將問題一般分為三層:
目標層(Goal):在該層只有一個元素,是待解決問題所設定的目標。
準則層(Criteria):該層包含了要實現預定目標所涉及的一系列中間環節,包涵了需要考慮的準則和子準則,因此可以有若干個層次組合而成。
方案層(Alternatives):該層包含了可供選擇的各種方案和措施等。
層次結構模型

(2)然後由層次圖構造判斷矩陣。對比較判斷矩陣是指相對上一層某一準則而言,與該準則有關聯的本層各要素之間的相對重要性。例如:方案層B(b1,b2,……,bn)相對上一層某一準則A而言有關聯。
矩陣資料是沿對角線對稱的,下三角是上三角資料的倒數。
判斷矩陣


bij取值含義

風險評估的資料需要專家和目標領域中資深的多年從業者給出,再進行進一步分析,所以下文引用的是參考論文中給出的例子。

(3)計算單個矩陣的權重向量。
計算權重

看著這個也許不太理解,ω為權重。舉個簡單的例子:
這裡寫圖片描述
這是直接擷取的軟體的矩陣,2x2的矩陣所以只需要輸入一個數據,因為對角線始終為1,而以對角線對稱的下三角資料為上三角的倒數。
於是,我們進行權重計算:
這裡寫圖片描述
首先進行列歸一化,再求行和列歸一化。0.2365就是A1對於A的權重,0.7635是A2對於A的權重。
學了線性代數應該知道如何求最大特徵值λ,不過太麻煩,所以我們用這種方法求λmax。
但實際構造出的對比較判斷矩陣要滿足所有以上的等式和要求是不可能的。因此退而允許對比較判斷矩陣在一定程度可以存在不一致,但對比較判斷矩陣也要有一定的一致性。
過程擷取結課報告上的:
一致性檢驗
計算量不算大,可以手動完成。
(4)計算各層元素對目標層的合成權重向量。將計算出來得到的各層次單排序,即每一層相對於上一層各個元素的相對權重,通過將各層的單排序結果進行進一步的計算就可得到層次結構模型中每一層的所有因素相對於目標層的組合權重,由上往下逐層進行最終得到方案層中的元素相對於目標層的組合權重,這一計算過程就叫層次總排序。
———————–然後如何計算風險等級:
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

以下是層次分析法模型例項,直接po軟體截圖:
模型
判斷矩陣如下:
這裡寫圖片描述這裡寫圖片描述
軟體會自動計算,也可匯出檔案。以下是結果:(Wi是對應的準則層所佔的權重)
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
總權重表:
總權重

———-計算風險等級的模型

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

附:
因為有現成的軟體,就沒有用MATLAB做模型,以下是實現演算法結果的java程式碼:(最好動手做一做MATLAB實現也不難,一下午上手實現風險評估的模型是綽綽有餘的)
`
import java.util.Scanner;

public class ahp {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    int n;
    Scanner sc=new Scanner(System.in);
    n=sc.nextInt();
    Arr a=new Arr();
    a.Arr(n);
    a.Normalization();
    a.rowSumAndNor();
    a.arrMul();
    a.avg();
    a.getCR();
    a.display();
}

}
`

import java.text.DecimalFormat;
import java.util.Scanner;

public class Arr{
    int n;//行,列的數目
    double[][] arr;//矩陣
    double[][] arr1;//中間值
    double[] row;//求行和的陣列
    double[] row1;//arr*row
    double vetor;
    double CR;
    Scanner sc=new Scanner(System.in);
//  DecimalFormat df=new DecimalFormat("0.0000");
    void Arr(){//不帶引數的建構函式
    }
    void Arr(int n){//帶引數的建構函式
        this.n=n;
        arr=new double[n][n];
        arr1=new double[n][n];
        for(int i=0;i<n;i++){//輸入資料
            for(int j=i+1;j<n;j++){
                arr[i][j]=sc.nextDouble();
            }
        }
        for(int i=0;i<n;i++){//對角線為1
            arr[i][i]=1;
        }
        for(int i=1;i<n;i++){//對稱的取倒數
            for(int j=0;j<i;j++){
                arr[i][j]=1/arr[j][i];
            }
        }
        row=new double[n];
        row1=new double[n];//初始化
    }
    void Normalization(){//歸一化處理
        double sum=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                sum+=arr[j][i];
            }//求列和
            for(int k=0;k<n;k++){
                arr1[k][i]=arr[k][i]/sum;
            }
            sum=0;
        }
    }
    void rowSumAndNor(){//求行和並且歸一化
        double sum=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                sum+=arr1[i][j];
            }
            row[i]=sum;
            sum=0;
        }
        for(int i=0;i<n;i++){
            sum+=row[i];
        }
        for(int i=0;i<n;i++){
            row[i]=row[i]/sum;
        }
    }
    void arrMul(){//arr*row
        double sum=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                sum+=arr[i][j]*row[j];
            }
            row1[i]=sum;
            sum=0;
        }
    }
    void avg(){//平均值
        double sum=0;
        for(int i=0;i<n;i++){
            sum+=row1[i]/row[i];
        }
        vetor=sum/n;
    }
    void getCR(){
        double[] RI=new double[]{0,0,0.52,0.90,1.12,1.26,1.36,1.41,1.46,1.49};
        double CI=(vetor-n)/(n-1);
        CR=CI/RI[n];
    }
    void display(){//列印
//      for(int i=0;i<n;i++){
//          for(int j=0;j<n;j++){
//              System.out.print(arr1[i][j]+" ");
//          }
//          System.out.println();
//      }
//      for(int i=0;i<n;i++){
//          System.out.print(row1[i]+" ");
//      }
        System.out.println();
        System.out.print("(");
        for(int i=0;i<n;i++){
            System.out.print(row[i]+" ");
        }
        System.out.print(")");
        System.out.println();
        System.out.println(vetor);
        System.out.println(CR);
    }
}