HTTP下密碼的安全傳輸、OAuth認證


在復雜的web環境下,我們沒有百分的把握保證信息在傳輸的過程中不被接貨,那不是用明文如何告訴服務器自己的身份呢?

在一些高度通信安全的網絡中,數據傳輸會使用HTTPS作為傳輸協議,但是通常情況下我們沒必要使用HTTPS傳輸,雖說安全,但傳輸數據都需要加密解密,很費事。我們可以使用一些加密方式(md5)對密碼進行加密即可。但是僅僅對密碼加密沒有任何作用,所以可以在密碼中加入一些其他字符,合並之后是這個密碼成為臨時密碼。

<label>username:</label><input id="uid" type="text" />
<label>password:</label><input id="pwd" type="password" />
<input type="submit" />
<script type="text/javascript">
    var t = new Date*1,
        uid = $("#uid").val(),
        pwd = $("#pwd").val(),
        delta = encrypt($("#pwd").val() + t);

    $.post("./login.php",{
        uid: $("#uid").val(),
        pwd: delta,
        tid: t
    }, function(data){
        //do something.
    })
</script>

在上面,提交表單時,pwd並不是真是的密碼,他是pwd與t混合再加密的字符串。這樣的話即便被截獲也是一個無效的數據。即便截獲后知道了破解方式,還可以在后台給他設定一個時效限制。

<?php
    define("uid", "user-A");
    define("pwd", "user-A-pwd");

if(time() - $_POST['tid'] > 60*2 ||
    $_POST['uid'] !== uid ||
    decrypt(pwd + $_POST['tid']) !== $_POST['pwd']){
    die("error");
}
?>

即如果下面三個條件有一個不滿足就報錯

1.時間超過兩分鍾

2.uid不匹配

3.pwd與t的組合密碼不匹配

當然,上面提到的encrypt和decrypt都是約定好的加密和解密方式,通常會使用md5加密。

這樣的加密傳輸方式。需要客戶端和服務器端的時間比較准確。如果考慮時間不准確的問題以及hacker動作迅速的問題,那就得用token來驗證了。

所謂的token,其實就是在登錄之前向服務器發送一個請求,獲取准入的一個臨時密碼,這個臨時密碼是由服務器給出,所以不存在上面所說的時間不准確的問題,同時這個token也是一個隨機字符串,只能單次使用,hacker很難獲取,即便獲取也無法使用,因為下一步登錄所需的信息他沒有。

很多網站的認證流程都是用的

OAuth認證原理

通過你在平台申請的API KEY向https://……/oauth/authorize請求一個臨時密碼,也就是token code,然后利用token code向https://……/oauth/token請求用戶數據。整個流程十分簡單。

這是一個簡單的demo,獲取你的頭像和姓名。

使用token的弊端是需要額外發送一次請求,過程稍微復雜。有些公司VPN通道就是利用token做密碼,為了保證高安全性,他們使用的是一個信息與服務器同步硬件設備,和銀行發的動態口令一樣,每次登陸都需要輸入這個口令,那這個口令也就是token,不過他不是網絡傳輸獲取,所以安全性更高

瀏覽器后退按鈕

這個在注冊或者登陸的時候是一個普遍的問題,登陸之后,跳轉到另外一個頁面,我的鼠標有兩個側鍵,是用於前進和后退的,有時候會誤點側鍵,這個時候頁面又會回到之前的登錄頁面,但事實是用戶已經登錄了,所有頁面的狀態都應該是已登錄的,不管什么情況下都不應該讓用戶在看到這個頁面。用戶的點擊操作會引發上面的問題,而程序 history.go(-1) & history.back() 也會有一樣的bug。

這樣的問題處理方案比較簡單,ajax 拿到 success 的狀態碼時立刻做跳轉,但是這里不能用 window.location.href,這樣瀏覽器還是會記錄這個登錄歷史,應該使用 window.location.replace,替換當前歷史記錄。

記住密碼

用戶最煩的就是每次登錄頁面都要輸入長長的賬號密碼,如果沒有勾選“記住密碼”,則用戶的登錄狀態保存在回話的 session 中,關閉頁面或者瀏覽器的時候,回話結束,session 被刪除,這樣當用戶下次登錄的時候又需要重新輸入密碼。表單頁面的“記住密碼”復選框默認狀態應該是已選擇,用戶的潛意識行為都是要少操作的。

當用戶提交信息成功之后,直接在 cookie 中保存賬號密碼?這樣的做法顯然是不合理的,密碼怎么能夠明文保存呢,有人會想到加密處理密碼然后再保存,或者使用服務器來設置 cookie,這些做法都是可以的,不過最好的方式是,當用戶成功提交信息時,服務器給前端提供一個 token,這個 token 是用於自動登錄的,我們只需要保存 token 就行了,這樣就很好的避免了 cookie 中存放用戶隱私信息了。

還有一個要注意的是,當用戶取消了“記住密碼”的復選框時,應該立即清除相關 cookie。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM