保護使用者口令的演算法及實現

來源:互聯網
上載者:User
演算法


  讀者總是問我怎樣才能在他們的網站上通過使用JavaScript來保護使用者的登陸口令,我的第一個反應就是告訴他們使用安全套接層(Secure Sockets Layer,SSL)。當使用正確時,SSL是安全敏感的Web程式最好的解決方案。然而,一些開發人員在發布對安全不那麼敏感的Web程式時更願意讓使用者登陸時不使用SSL。

  Web程式使用一種稱為工作階段狀態管理(session state management)的技術來跟蹤瀏覽器與伺服器之間的互動,正如超文字傳輸通訊協定 (HTTP)所規定的那樣,每個瀏覽器的請求都獨立於其他瀏覽器,一個Web程式必須使用一些技巧,如cookie,隱藏的表格欄位,或URL重寫,來識別其與特定的瀏覽器的特定的會話。大多數伺服器端開發環境如ASP,PHP,ColdFusion等使用cookie。

  使用工作階段狀態管理的問題是從根本上說它是不安全的,一個駭客可以在伺服器和使用者瀏覽器之間截取用來管理工作階段狀態的cookie,表格欄位值,或是URL,一旦得手,他就可以利用這些資訊來接管使用者的會話!(譯者註:典型的例子如冒充交易使用者競價)

  大多數伺服器端的指令碼開發環境允許你減少這種危險,例如你可以指定cookie的極短失效時間,使用難預測的工作階段狀態資訊。然而最安全的還是使用安全套接層(SSL),購買它後,你就可以不僅保護使用者口令,還可以保護工作階段狀態管理資訊。

  如果你不使用SSL,讓使用者在你的程式中的安全敏感頁面中每次都重新認證是個好主意,但是從使用者角度出發,這實在是太麻煩了。最後,你必須考慮你和你的使用者究竟願意承擔多大的風險。如果密碼口令被曝光的危險很高,還是用SSL來構建你的程式吧,如果你不能使用SSL,那麼就使用基於MD5的登陸過程。這至少能保護你的使用者的口令。此外,選擇一種允許保護工作階段狀態資訊的伺服器端指令碼技術。

  通常,當使用者不使用SSL(即普通HTTP)登陸時,他(她)的口令從離開瀏覽器起至到達伺服器為止始終是以明文狀態暴露的。

  然而,利用一種稱為單向函數的數學函數的協助,我們可以設計一種並不暴露使用者口令的登陸計劃。一個函數是一種將集合A的元素映射到集合B的方法,每個集合A中的元素都對應於集合B中的一個確定元素。而一個單向函數的作用就是使逆向的推算非常困難,即,給定集合B的一個元素,很難從集合A中決定哪個元素(如果存在的話)是映射到B集合中的這個元素的。

  一個很好的類比是碎紙機,把檔案放到碎紙機中切碎很方便,而從片段中重建原檔案就相當困難了。

< Adelman Shamir, Rivest是著名的RSA密碼編譯演算法的三位發明人:Rivest, Rivest(Ronald Digest的縮寫,MD5是一種128位的雜湊演算法),由Ronald  一個非常流行且被廣泛使用的單向函數應用是MD5演算法(譯者註:MD是Message>

  我們現在就來利用MD5演算法開發一個過程,它將能夠保護從瀏覽器傳送到伺服器的口令。

  使用者試圖登陸到一個Web應用程式時,伺服器端指令碼提供使用者一個包含有從數十億可能值中產生的隨機數的表格,當使用者在此登陸表格中輸入她們的ID和口令,用戶端的指令碼將這個隨機數值添加到口令後並加以MD5單向運算。然後以MD5演算法的輸出作為口令,我將稱這個口令為MD5口令。

  用戶端指令碼然後將使用者ID和MD5口令傳輸至伺服器,因為這個值是MD5演算法的輸出,反向推算出使用者原來輸入的口令是幾乎不可能的。(譯者註:MD5演算法已有被德國解密專家攻破的紀錄,在對安全要求很高的場合使用仍存在風險)

  當使用者ID和MD5演算法得出的口令被Web應用程式接收到後,Web程式執行與使用者瀏覽器相同的操作,它將當初傳給使用者的隨機數加到使用者口令後,(此口令取自伺服器中被保護地區)然後計算出正確的MD5口令值,將此數值與從瀏覽器收到的值作一比較,如相等,則設定一個伺服器端工作階段變數以確定使用者認證通過。

  此時你可能會疑惑為什麼要使用隨機數,隨機數是用來防止重新攻擊的,如果僅使用者口令經過MD5運算,此MD5口令將始終保持一個值,監聽的駭客只需簡單地截獲這個MD5口令就可用它來登陸進Web應用程式。這個隨機數保證了每次新的登陸都有一個特定的MD5口令。

  基於MD5的登陸方案用JavaScript來實現相對容易,一個開放源碼的完全實現可從Paul Johnston處得到。(譯者註:見附錄)

  我們現在用ASP來實現伺服器端指令碼(因為它支援JScript,MicroSoft版本的JavaScript)。你當然可以用其他任何伺服器端指令碼,只不過你得將MD5演算法翻譯成那種語言。
  以下是登陸表格的ASP實現,login.asp:

$#@60;%@ LANGUAGE = "JScript" %$#@62;
$#@60;HTML$#@62;
$#@60;HEAD$#@62;
$#@60;TITLE$#@62;Please log in!$#@60;/TITLE$#@62;
$#@60;% Session("sharedValue") = Math.random().toString() %$#@62;
$#@60;SCRIPT LANGUAGE="JavaScript" SRC="md5.js"$#@62;$#@60;/SCRIPT$#@62;
$#@60;SCRIPT LANGUAGE="JavaScript"$#@62;

var sharedValue = "$#@60;% =Session("sharedValue") %$#@62;"

function handleLogin() {
sendMD5Value(calculateMD5Value())
}

function calculateMD5Value() {
var pw = document.forms["login"].elements["password"].value
pw += sharedValue
return calcMD5(pw)
}

function sendMD5Value(hash) {
document.forms["login"].elements["password"].value = hash
document.forms["login"].submit()
}

$#@60;/SCRIPT$#@62;
$#@60;/HEAD$#@62;
$#@60;BODY$#@62;

$#@60;FORM NAME="login" METHOD="POST" ACTION="checkpassword.asp"$#@62;
User ID: $#@60;INPUT TYPE="TEXT" NAME="userid" SIZE="40"$#@62;$#@60;BR$#@62;
Password: $#@60;INPUT TYPE="PASSWORD" NAME="password" SIZE="40"$#@62;$#@60;BR$#@62;
$#@60;INPUT TYPE="BUTTON" NAME="startLogin" VALUE="Login" $#@62;
$#@60;/FORM$#@62;

$#@60;/BODY$#@62;
$#@60;/HTML$#@62;

以上只有三行是ASP指令碼(ASP指令碼由$#@60;% 和%$#@62;括起) 。

在伺服器端一個名為checkpassword.asp的指令碼驗證使用者ID和MD5口令:

$#@60;%@ LANGUAGE = "JScript" %$#@62;
$#@60;!--#include file ="md5.inc"--$#@62;
$#@60;%
function calculateMD5Value() {
var pw = "" + Application(Request.Form("userid"))
pw += Session("sharedValue")
return calcMD5(""+p br> }
clientPassword = Request.Form("password")
serverPassword = calculateMD5Value()
if(clientPassword == serverPassword) Response.Redirect("page1.htm")
else Response.Redirect("tryagain.htm")
%$#@62;

  認證過程的核心由calculateMD5Value()函數後的四行語句實現。

  實施此方案時,只需改變page1.html為你要保護的應用程式的第一頁,如果你不用ASP,則需將以上ASP翻譯為你的伺服器端指令碼語言。




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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