專案要開工了,伺服器先行,下面講講我設計的乙個客戶端與伺服器通訊的認證系統。
這些客戶端都是官方客戶端,對客戶端都沒有採用oauth的認證,其實想想也是沒必要的,oauth只是用於第三方在不需要使用者的使用者名稱和密碼的情況下獲得使用者的授權並操作受保護的資源。
使用者認證包括註冊和登入,為了防止使用者名稱和密碼被不良青年竊聽,看一下上述四個軟體分別是怎麼做的。
雲端書庫是閉門造車,一切認證在他面前都是浮雲。當我在測他的搜尋功能時,改軟體竟然直接發出了資源獲取的get請求,並且是直接定位到資源的url。唯一的可能就是改軟體已經把整個資料庫放在了客戶端,所有搜尋在客戶端直接搞定。這樣他就不需要公布openapi,這些已經都是浮雲了。這樣一想,他的客戶端安裝包有100m多也就想得通了。
他的openapi沒什麼保護,直接用瀏覽器也能進行呼叫。
這裡人人網的技術含量還是算最高的,在使用者註冊登入上,所有的資料報都不會出現密碼,不管是明文還是加過密的,只會出現乙個apikey,niquleid 和uid,所有的認證和api呼叫都解決了。關鍵是註冊時,人人網選擇了簡訊形式註冊,避免了密碼洩露的危險。
跟據這幾個客戶端的分析,考慮到以後我們可能會有付費會員,使用者的認證和openapi的保護是非常重要的。下面是設計的系統方案。
下面會用到一些變數,這裡進行解釋。
key, 提前約定的客戶端與伺服器之間的金鑰,用於保證apikey申請系統不被攻擊,只有我們的客戶端可以申請,確定每乙個申請的apikey都是有效的。
apikey用於對系統openapi的保護,每個客戶端對應乙個apikey,因此可以對使用者的一些操作進行限制,比如乙個小時內某些方法或資源呼叫的次數。
token使用者保護使用者的密碼,避免使用者的密碼在資料報中出現。特別針對以後有可能出現的收費使用者,密碼的保護非常重要。
客戶端:
[php]view plain
copy
$key
= '提前定義好的金鑰字串'
;
// 客戶端和伺服器端都有,其他人都不知道這個金鑰字串。
dowhile
($result
->state != 0)
$apikey
= $result
->key;
[php]view plain
copy
$key
='提前定義好的金鑰字串'
; $request
= $server
[get];
//獲取客戶端的請求資訊
$once
=$request
[once];
$serverauth
= md5(
$key
,$once
); if(
$serverauth
== $request
[auth] && !
$db->search(
$once
))
//認證串相等並且資料庫中沒有這個once
elseif(
$serverauth
== $request
[auth] &&
$db->search(
$once
))
//認證串相等,但資料庫中已經有這個once,證明是攻擊者,竊取了別人的認證資訊。
else
response($state
=1);
//可能也是攻擊者,也可能是客戶端發出的請求發生了什麼未知問題。
請求中攜帶 apikey, username, password的md5值,email。
客戶端
[php]view plain伺服器copy
$passwordmd5
($password
);
$result
= $request
('post'
, $apikey
, $username
, $passwordmd5
); if(
$result
== 0)
else
return
;
//使用者名稱已經被註冊
[php]view plaincopy
$request
= $server
[post];
if(!(
$db->search(
$request
[apikey])))
//apikey 錯誤, 可能是不壞好意的人惡意呼叫這個openapi。if(
$db->search(
$request
[username]))
//使用者名稱已經被註冊了
$db->store(
$request
[username],
$request
[passwordmd5],
);
response($state
= 0);
//註冊成功
return
;
經過這樣的認證,以後使用者操作自己的資源時只要帶上 $username,$apikey, $token 這三個驗證資訊就行了。客戶端
[php]view plain
copy
$token
= md5(
$apikey
, md5(
$password
));
$result
= request(
'post'
, $username
, $apikey
, $token
); if(
$result
->state = 0)
//登陸成功
else
伺服器[html]view plain
copy
$request
= $server[post];
if(!($db->
search($request[apikey])))
//apikey 錯誤, 可能是不壞好意的人惡意呼叫這個api。
if(!($passwordmd5
= $db-
>
search($request[username])))
//找不到對應使用者名稱的密碼,伺服器存的都是密碼的md5值
$servertoken
= md5
($request[apikey], $passwordmd5);
if($servertoken != $request[$token])
//某些未知錯誤,一般不可能發生
response($state= 0
);
$db->
store($token); //儲存經過驗證的$token
總得來說這個系統能
保護了使用者的密碼不在網路上明文傳輸,唯一出現的一次機會是註冊時傳輸的密碼的md5值。
對於openapi,有了apikey之後就能對客戶端呼叫openapi做乙個有規則的限制,避免了不良it青年惡意頻繁呼叫openapi對伺服器造成壓力。
apikey的申請規則又保護了申請apikey的openapi,只對我們的客戶端開放,其他惡意it青年都不能無法申請,因為他們不知道我們的約定key。
簡單http認證系統的設計
專案要開工了,伺服器先行,下面講講我設計的乙個客戶端與伺服器通訊的認證系統。這些客戶端都是官方客戶端,對客戶端都沒有採用oauth的認證,其實想想也是沒必要的,oauth只是用於第三方在不需要使用者的使用者名稱和密碼的情況下獲得使用者的授權並操作受保護的資源。使用者認證包括註冊和登入,為了防止使用者...
HTTP的幾種認證方式
基礎認證簡單的使用base64對密碼 使用者名稱進行加密,並將加密後的資訊放在header中,本質上還是明文傳輸使用者名稱 密碼等,基本流程 摘要認證使用隨機數 md5加密雜湊函式來對使用者名稱 密碼進行加密,在上述第二步時伺服器返回隨機字串nonnce,之後客戶端傳送摘要 md5 ha1 nonc...
PHP的HTTP認證機制
php的http認證機制因此該功能不適用於 cgi 版本。在 apache 模組的 php 指令碼中,可以用 header 函式來向客戶端瀏覽器傳送authentication required資訊,使其彈出乙個使用者名稱 密碼輸入視窗。當使用者輸入使用者名稱和密碼後,包含有 url 的 php 指...