USBKEY使用者認證平台的研究和實現

來源:互聯網
上載者:User

0      引言
        近幾年來,隨著資訊化的快速發展,越來越多的企業認識到資訊化對企業生產和管理的重要性,開始在資訊化上展開工作並加大投入。一些大型企業實施了MIS、OA、MES、ERP等管理系統,逐步實現企業的生產、管理、電子商務等諸多業務電子化、無紙化。企業都期望藉助資訊化的平台,提供新的管理手段與模式,提高企業的管理效率,加快企業的發展。
企業中的這些應用系統採用不同的技術開發,雖然實現的功能千差萬別,但是出於安全考慮,每個系統都要鑒別使用者的身份,都要求使用者輸入使用者名稱和密碼。
        使用者在日常工作中,要記住每個系統的使用者名稱和密碼,在系統日益增多的情況下,很多使用者會把不同的系統的帳號和密碼搞混淆或忘記了密碼。另一方面,每個單獨的系統都會有自己的安全體系和身份認證系統,要求各使用者密碼必須有足夠長度而且不能單純為字母或數字,使用者記住密碼存在難度。
        在實際使用中由於一些原因,例如將使用者名稱和密碼記在本子上,長期不修改密碼,惡意將使用者名稱和密碼資訊告訴其他人,還有個別人暴力破解等,容易出現泄露事件,造成資訊損失。而且一旦發生使用者密碼密碼資訊泄露,還不能確認其泄露行為。
        如今網路上的木馬盜號違法行為盛行,可以說,只要上互連網,幾乎每一台電腦都可能遭受到攻擊,而傳統使用的靜態密碼(使用者名稱+密碼)是被認為是極度危險的身份認證手段,所以對重要而敏感的網上身份認證安全不得不引起我們非常的重視。[1]
        綜上所述,在今天公司資訊化的發展形勢下,簡單的使用者密碼驗證方式已經暴露出很多問題,給管理和安全上帶來很大隱患。所以需要一種安全性更高的而且人為影響因素小的使用者認證方式來替代原有方式。
1主要的身份認證技術及優勢比較
        目前,電腦及網路系統中常用的身份認證方式主要有以下幾種:
        (1)使用者名稱+密碼方式
        (2)智慧卡認證
        (3)動態口令
        (4)USB KEY認證
        (5)生物識別技術技術
        幾種認證技術比較見表1。
       上述幾種技術,安全性最高的是動態口令、USB KEY和生物識別特徵識別,但生物識別技術技術還有待提高,而且根據現實使用方式適用於企業做身份認證的,只有動態口令和USB KEY,相比較USB KEY 成本較低,性價比較高,而且USB介面又有通用性,因此USB KEY認證技術最適合應用推廣。由於USB KEY具有安全可靠,便於攜帶、使用方便、成本低廉的優點,加上PKI體系完善的資料保護機制,使用USB KEY儲存數位憑證的認證方式已經成為目前主要的認證模式。[2]
2 USB KEY認證概述
2.1 USB KEY認證
       USB KEY認證最早是由軟體保護廠家提出來的,它結合了現代密碼學技術、智慧卡技術和USB技術,是新一代身份認證產品。它具有以下特點:
        (1) 雙因子認證
        每一個USB KEY都具有硬體數字 PIN 碼保護,數字 PIN 碼和硬體構成了使用者使用USB KEY的兩個必要因素,即所謂"雙因子認證"。使用者只有同時取得了USB KEY和使用者數字 PIN 碼,才可以登入系統。即使使用者的數字 PIN 碼被泄漏,只要使用者持有的USB KEY不被盜取,合法使用者的身份就不會被仿冒;如果使用者的USB KEY遺失,拾到者由於不知道使用者數字 PIN 碼,也無法仿冒合法使用者的身份。
        (2) 帶有安全儲存空間
        USB KEY具有8K-128K的安全資料存放區空間,可以儲存數位憑證、使用者密鑰等秘密資料,對該儲存空間的讀寫操作必須通過程式實現,使用者無法直接讀取,其中使用者私密金鑰是不可匯出的,杜絕了複製使用者數位憑證或身份資訊的可能性。
        (3) 硬體實現密碼編譯演算法
        USB KEY 內建CPU或智慧卡晶片,可以實現PKI體系中使用的資料摘要、資料加解密和簽名的各種演算法,加解密運算在USB KEY內進行,保證了使用者密鑰不會出現在電腦記憶體中,從而杜絕了使用者密鑰被駭客截取的可能性。一般支援RSA,DES ,SSF33和3DES演算法。
       (4) 使用方便,安全可靠
USB介面已經廣泛應用,而且如拇指般大的USB KEY非常方便隨身攜帶,並且密鑰和認證不可匯出,KEY的硬體不可複製,保證了使用的安全可靠。[3]
2.2 USB KEY認證的兩種應用模式
        USB KEY身份認證主要有兩種應用模式:
       (1)基於衝擊-響應的認證模式
       USB KEY內建單向散列演算法(MD5),預先在USB KEY和伺服器中儲存一個證明使用者身份的密鑰,當需要在網路上驗證使用者身份時,先由用戶端向伺服器發出一個驗證請求。伺服器接到此請求後產生一個隨機數回傳給用戶端裝置上插著的USB KEY,此為“衝擊”。USB KEY使用該隨機數與儲存在USB KEY中的密鑰進行MD5運算得到一個運算結果作為認證證據傳送給伺服器,此為“響應”。與此同時,伺服器使用該隨機數與儲存在伺服器資料庫中的該客戶密鑰進行MD5運算,如果伺服器的運算結果與用戶端傳回的響應結果相同,則認為用戶端是一個合法使用者。
        圖1中“x”代表格服務器提供的隨機數,“KEY”代表密鑰,“y”代表隨機數和密鑰經過MD5運算後的結果。通過網路傳輸的只有隨機數“x”和運算結果“y”,使用者密鑰“KEY”既不在網路上傳輸也不在用戶端電腦記憶體中出現,網路上的駭客和用戶端電腦中的木馬程式都無法得到使用者的密鑰。由於每次認證過程使用的隨機數“x”和運算結果“y”都不一樣,即使在網路傳輸的過程中認證資料被駭客截獲,也無法逆推獲得密鑰。因此從根本上保證了使用者身份無法被仿冒。
        (2)基於PKI的數位憑證的認證模式
        ? 衝擊響應模式可以保證使用者身份不被仿冒,但無法保證認證過程中資料在網路傳輸過程中的安全。而基於PKI的“數位憑證認證方式”可以有效保證使用者的身份安全和資料轉送安全。USBKEY儲存了數位憑證和使用者私密金鑰,在KEY內用私密金鑰將原文加密,與原文和數位憑證一起打包通過網路傳輸,伺服器端接收後還原出數位憑證,利用公開金鑰解密,結果與原文校正,確定使用者合法性。而數位憑證儲存在USB KEY中可以保障數位憑證無法被複製,所有密鑰運算在USB KEY中實現,使用者密鑰不在電腦記憶體出現也不在網路中傳播,只有USB KEY的持有人才能夠對數位憑證進行操作。
3 USB KEY 認證設計
        USBKEY認證平台內容包括:構建企業CA簽名及驗證服務平台, 用戶端使用簽名控制項對使用者登入資訊進行數位簽章加密,伺服器端使用驗證服務平台對使用者的數位簽章加密資訊進行解密並驗證。
3.1 USB KEY認證的流程
        USB KEY認證採用目前普遍使用的基於PKI的數位憑證驗證方式,這種方式既保證了使用者身份安全,也保證了資料轉送安全。簽名驗證流程見圖2。
        (1)使用者輸入數字 PIN 碼?,通過控制項來讀取USB KEY中儲存的的數位憑證及私密金鑰資訊。
        (2)USBKEY內建密碼編譯演算法,使用私密金鑰,對使用者登入資訊進行簽名加密。
        (3)根據PKCS#7標準,將原文和簽名後的密文和自己的數位憑證打包。
        (4)用戶端將打包報文發送給證明伺服器。
        (5)證明伺服器收到報文,根據PKCS#7格式讀出打包資訊。
        (6)證明伺服器驗證使用者端所提供的數位憑證的有效期間、憑證鏈結,並完成黑名單檢查,失敗則放棄。
        (7)有效期間、憑證鏈結和黑名單驗證通過後,證明伺服器即使用使用者的數位憑證的公開金鑰對使用者所提供的密文進行解密。
        (8)解密後的報文和原文核對,相同則表明接受由使用者提交的數位憑證所申明的身份。
        從上面過程看出,認證過程主要分為兩部分:用戶端數位簽章過程和伺服器端驗證過程。
3.2 USB KEY認證系統構成
        USB KEY認證系統主要包括CA認證中心,驗證伺服器和USB KEY。CA認證中心實際是PKI的核心,還應該包括認證申請登錄授權單位RA(Registration Authority),它是數位憑證的申請註冊、認證簽發和管理機構。[4]簽名驗證伺服器提供數位簽章服務以及對資料驗證其數位簽章的真實性。USB KEY是數位憑證的載體(見圖3)。
3.3 認證認證系統
        認證認證系統一般包含PKI體系個人與伺服器數位憑證簽發、廢除等管理服務,Key Management Service、認證認證服務、使用者註冊管理服務、Web服務、資料庫服務、LDAP服務、日誌審計服務等功能。簽名驗證伺服器的結構如下:
        簽名驗證系統由驗證伺服器和驗證用戶端組成,驗證伺服器提供服務,驗證用戶端請求服務。應用的用戶端需要進行二次開發,發送請求時需要調用格爾簽名驗證產品的用戶端API發送驗證請求,並且獲得驗證結果。
4 USB KEY認證系統實現
4.1 USB KEY認證開發環境
        USBKEY:握奇資料公司USBKEY
        CA伺服器:上海格爾CA證明伺服器
        簽名驗證伺服器:上海格爾簽名證明伺服器(SVS)。
        介面包:格爾簽名驗證伺服器提供的簽名控制項介面SignX.cab,及伺服器端簽名及驗證開發包koal_svsapi_1.7.0_jdk1.4.2,握奇資料公司USB KEY開發包。
4.2 開發內容
        CA伺服器數位憑證頒發數位憑證,通過USB KEY應用程式將數位憑證和私密金鑰寫進USB KEY;用戶端電腦通過簽名控制項讀寫USB KEY中的認證和私密金鑰,並通過KEY中的智能晶片用私密金鑰對使用者資訊加密,用戶端將原文及密文和數位憑證打包發給簽名證明伺服器,簽名證明伺服器將核對數位憑證有效性,並用公開金鑰揭秘出原文並核對,從而確認用戶端身份。
        現在公司專屬應用程式系統多為B/S模式,USB KEY認證需要開發的工作,除USB KEY讀寫應用程式外,用戶端簽名和伺服器端驗證都為B/S模式,需要在B/S開發環境下對簽名控制項和驗證開發包做開發整合。
        用戶端簽名部分,通過控制項開發介面,實現對USB KEY儲存的數位憑證的讀取,實現用私密金鑰對原文加密簽名。
        伺服器驗證部分,通過介面開發包,實現數位憑證讀取核對,實現用公開金鑰解密密文。
4.3 用戶端簽名控制項函數定義
       (1)簽名控制項開發介面主要函數定義
       函數名:long HashData(const VARIANT FAR& varData,long lHashAlgorithm)
       說明:對記憶體中的資料區塊進行HASH演算法處理。
       參數:varData 待HASH的資料,支援的資料輸入格式有VT_BSTR和VT_BYREF|VT_BSTR、VT_ARRAY|VT_I1、VT_ARRAY|VT_UI1。
傳回值:0表示成功,-1表示失敗。
       函數名:long Sign(const VARIANT FAR& varData,long lHashAlgorithm)
       說明:對資料用lHashAlgorithm指定HASH方法進行簽名,簽名結果使用GetSignResult擷取。
       參數:varData待簽名的資料,支援的資料輸入格式有VT_BSTR和VT_BYREF|VT_BSTR、VT_ARRAY|VT_I1、VT_ARRAY|VT_UI1。
       函數名:BSTR GetSignResult()
       說明:返回成功簽名的簽名資料,簽名資料以BASE64編碼返回。
       傳回值:BASE64格式的簽名資料。
       函數名:long SignPKCS7(const VARIANT FAR& varData,long lHashAlgorithm)
       說明:對資料進行PKCS#7的Attach方式的簽名。簽名結果使用GetSignResult取得。
       參數:varData 待簽名的資料。支援的資料輸入格式有VT_BSTR和VT_BYREF|VT_BSTR、VT_ARRAY|VT_I1、VT_ARRAY|VT_UI1。
傳回值:0 表示成功,-1表示失敗
        函數名:BSTR GetCurrentUsedCertInfo(long lID)
        說  明:擷取當前正在使用的認證的資訊
        參  數:lID 需要擷取的資訊。
        傳回值:相應的認證資訊。
        函數名:BSTR GetLastErrorString()
        說明:返回最後一次操作的錯誤說明。
        傳回值:錯誤說明。
        函數名:long GetLastErrorCode()
        說明:返回最後一次操作的錯誤類型編號。使用GetLastErrorString來擷取錯
        誤的詳細資料。
        傳回值:錯誤類型編號。
4.4 用戶端簽名程式設計
        對使用者登入資訊的數位簽章可以採取兩種方式:可以使用用戶端簽名控制項進行簽名的方式,也可以使用向簽名驗證伺服器提交擷取簽名的方式。這裡採取簽名控制項的方式對系統的帳號和密碼進行數位簽章,簽名的方式使用PKCS#7,即簽名資料和數位憑證一起打包發送。經過PKCS#7進行簽名的資料中包括三部分,即資訊原文、密文和使用者的數位憑證。
用戶端簽名過程嵌入在使用者登入介面login.jsp中,對使用者口令進行數位簽章部分的代碼如下:
function SignPKCS7()
{
  var Data1 = GetData_username();
  var Data2 = GetData_password();
  var HashAlg = GetHashAlg();
  SetShowDataBeforeSign();
  if (0 == document.signx.selectcert())//選擇使用者數位憑證
  {
   //簽名使用者名稱
    if (0 == document.signx.signpkcs7(Data1,HashAlg)){
     document.form1.username.value = document.signx.GetSignResult();
    }
    else {
     GetLastErrorString();
    }
   //簽名使用者口令
    if (0 == document.signx.signpkcs7(Data2,HashAlg)){
     document.form1.password.value = document.signx.GetSignResult();
    }
    else {
     GetLastErrorString();
    }
  }
  else {
   GetLastErrorString();
  }
}
</script>
 </head>
<body bgcolor="#FFFFFF" leftmargin="0" topmargin="0">
 <!-- 定義簽名控制項  -->
 <OBJECT id=signx height=40 width=200 classid=
                 CLSID:7AA0F60A-7F84-4233-9B84-15E0A9D6DCF1
                 codebase=Signx.cab VIEWASTEXT></OBJECT>
        在使用者登入時,插入自己的USB KEY,選擇自己的數位憑證對使用者口令進行數位簽章後提交到伺服器進行驗證。
4.5 簽名驗證伺服器介面函數設計
        格爾驗證伺服器介面包名:koal_svsapi_1.7.0_jdk1.4.2.jar,其中主要函數定義如下
對PKCS#7格式簽名資料進行驗證 :
Parameters:
szPKCS7BASE64Data - 待驗證的PKCS#7簽名資料(BASE64編碼)
arrayOriginData - 如果PKCS#7簽名資料中未包含簽名原文資訊,可在此添入,否則必須將該參數設定為NULL
nOriginLen - 簽名資料原文的長度,如果pOriginData為NULL,則將該參數設定為0
hostInfo - 驗證伺服器的地址資訊
Returns:
0 // 擷取認證資訊成功 其它 // 錯誤碼
Throws:
java.lang.Exception
public int verifyCert(java.lang.String szBASE64Cert,
                      int nFlagOCSP,
                      int nFlagCRL,
                      THostInfoSt hostInfo)
         throws java.lang.Exception
驗證認證的狀態:
Parameters:
szBASE64Cert - 待驗證的認證(BASE64編碼)
nFlagOCSP - 是否進行OCSP驗證 0 否 1 是
nFlagCRL - 是否進行黑名單驗證 0 否 1 是
hostInfo - 驗證伺服器的地址資訊
Returns:
0 認證沒有問題 1 認證尚未生效 2 認證已經到期 3 認證時間有問題 4 沒有有效憑證鏈結 5 簽名驗證失敗 6 上級認證未通過驗證 7 已被廢除 8 認證狀態未知 其它負值 錯誤碼
Throws:
java.lang.Exception
getCertInfo
public GetCertInfoSt getCertInfo(java.lang.String
 szBASE64Cert,
int nType,java.lang.String
 szItemName, THostInfoSt hostInfo)
     throws java.lang.Exception
擷取認證的認證項資訊:
Parameters:
      szBASE64Cert - 待擷取資訊的認證(BASE64編碼)
nType - 欲擷取的認證項資訊的類型 0 認證所有者資訊 1 憑證簽發者資訊 2 認證擴充項資訊
szItemName - 認證項的名稱
hostInfo - 驗證伺服器的地址資訊
Returns:
GetCertInfoSt結構,其中包含返回結果及認證項資訊
Throws:
java.lang.Exception
4.6 USB KEY伺服器驗證過程實現
        使用者提交的經過PKCS#7簽名的登入資訊到伺服器,由伺服器對簽名後的使用者資訊進行驗證,並且從簽名資訊中擷取原文,然後對使用者帳號和使用者口令原文資訊進行登入驗證。
伺服器端使用者驗證的部分代碼如下:
   String hostip = "192.168.0.5";//簽名驗證伺服器的IP地址
  int hostport = 5000;//簽名驗證伺服器提供驗證服務的連接埠
  THostInfoSt hostInfo = new THostInfoSt();
  hostInfo.setSvrIP(hostip);
  hostInfo.setPort(hostport);
  String szSignedData = request.getParameter("password"); 
 //擷取經過數位簽章後的使用者口令
  nRet = SvsClientHelper.PKCS7DataVerify(szSignedData,null,0,hostInfo);
 //簽名驗證,返回0表示成功,否則驗證失敗。
  if(nRet==0){//如果簽名驗證成功
   String password = SvsClientHelper.
               PKCS7DataVerifyGetOriData(szSignedData,null,0,hostInfo);
               //擷取簽名後的原文資料,即使用者口令的原文
   String username = request.getParameter("username");
   //String password = request.getParameter("password");
   request.setCharacterEncoding(ConnectOracleDB.CharEncoding);
   response.setContentType("text/html");
   response.setCharacterEncoding(ConnectOracleDB.CharEncoding);
   PrintWriter out = response.getWriter();
   if(ConnLogin.CheckUser(username,password))
 //使用者帳號和口令驗證成功
   {
    String theme = ConnLogin.getUserTheme(username);
    request.getSession().setAttribute("Theme",theme);
    request.getSession().setAttribute("username",username);
    request.getSession().setAttribute("adminlevel",ConnLogin.adminlevel);
    request.getSession().setAttribute("theme",theme);
    System.out.println("Login User is " +
                              request.getSession().getAttribute("username"));
    out.println("<META HTTP-EQUIV=/"REFRESH/"
                    CONTENT=/"0;url=/unisso/pages/theme/ssomain.jsp/">");
   } else{//使用者帳號和口令驗證失敗
    String outs = "<html><head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"><META HTTP-EQUIV="REFRESH" CONTENT="8;url=/unisso/"><link href="/css/style.css" rel="stylesheet" type="text/css"><title>登入失敗</title></head><body><br><br><br><center><p class="unnamed1">登入失敗,使用者名稱不存在或者密碼錯誤!</p><p class="unnamed1">8秒後返回登入頁面或者點擊<a href="/unisso/">這裡</a>返回</p></center></body></html>";
    out.println(outs);
   }
  }else{//如果簽名驗證失敗
   String outs = "<html><head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"><META HTTP-EQUIV="REFRESH" CONTENT="8;url=/unisso/"><link href="/css/style.css" rel="stylesheet" type="text/css"><title>登入失敗</title></head><body><br><br><br><center><p class="unnamed1">登入失敗,簽名驗證失敗!請插入正確的UsbKEY。</p><p class="unnamed1">8秒後返回登入頁面或者點擊<a href="/unisso/">這裡</a>返回</p></center></body></html>"。
        這樣通過驗證簽名資訊的有效性,只有使用者擁有USB KEY並且通過使用者帳號和使用者口令驗證才能登入系統,即使擁有USB KEY,如果不知道系統中的使用者口令,也無法正常登入和使用系統,從而充分保證了使用者登入資訊的安全。也就是說USB KEY、使用者帳號和使用者口令,缺少任何一個都無法登入和使用系統。
5結語
        本文分析了現在企業多數資訊應用系統使用者認證的安全弊端,提出了使用USB KEY來作為身份認證替代方式,提出了設計並搭建環境進行了實施,證明了該認證平台的可行性。該平台目前運行良好,極大地提升了應用系統的安全性,解決了企業現實存在的實際問題,具有較強的實用性。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.