主要講兩點一,是么是重放攻擊?
二,怎么樣防止重放攻擊?
一,重放攻擊:顧名思義,重:再次放的意思。
主機A要給主機B發送報文,中間重放攻擊的主人可以是A,或者是攻擊者C
:當是A時,表示A會重復發送相同的報文給B,
:當是C時,表示C截獲了A發送給B的報文,然后再偽裝成A給B發送其截獲的報文
重放攻擊的含義:主機A給主機B發送的報文被攻擊者C截獲了,然后C偽裝成A給B發送其截獲來的報文,而B會誤以為C就是A,就把回應報文發送給了C。
雖然A是加密的,但C根本不用破譯。
實例分析:登錄驗證
登錄驗證的基本流程:(4步)
1,前端:
用戶輸入賬號,密碼,然后登錄
2,用戶在發送登錄請求之前,web端會首先對明文密碼進行md5加密(而加密后的密碼會儲存於后端的數據庫中)
3,提交賬號及md5加密后的密碼
4,請求到達后端,將 從數據庫中提取的賬號與密碼和現在提交的賬號與密碼進行比較,如果相同,則登錄成功。
那么在這中間會出現什么問題呢?
思考:這個過程安全嗎?
我們知道,在此過程中傳輸的是經過md5加密后的密碼,即使被監聽者截取到,而md5是不可逆的,明文密碼也不會泄露的 。
其實不然,監聽者無需解出密碼明文,即可登錄——因為監聽者只需將監聽到的URL(uniform )重放一下,即可冒充你的身份登錄系統。
下面我們講解一下稍微安全一點的登錄:
關鍵是:進行了兩次加密,且攻擊者的session中的隨機碼與數據庫中的隨機碼相同的概率可以忽略。
1,進入前端用戶登陸界面時生成一個隨機碼(鹽值)(此隨機碼會在客戶端和后端session中各保存一個)
2,用戶在發送登錄請求之前,web端首先會對明文密碼進行md5加密,存於數據庫中,然后加密后的密碼再與鹽值連接,再進行md5加密
最后密碼=md5{[md5(明文密碼)]+隨機碼}
3,請求到達后端后,將 從數據庫中提取的md5加密后的密碼+后端session中的鹽值進行md5加密,與發送來的密文進行對比,若相同,則成功。
更安全的登陸流程:
1,系統隨機生成一個固定鹽值,uerooejioeueo%@*?.,*6hgk,>ikuolm 足夠復雜
2,當用戶注冊,修改密碼時,明文密碼會先於固定鹽值連接,進行md5加密,然后再與隨機碼連接再次進行md5加密
最后密碼=md5{【md5(明文密碼+固定鹽值)】+隨機碼}
最后更加完善的方式:
1,設置登陸驗證碼、
2,錯誤達到一定次數,鎖定賬號幾分鍾
3,存數據庫前再加一次鹽,然后再md5一次,防止拖庫被猜密碼
二,防御方案:
1,加隨機數:雙方只需要記住各自使用過的隨機數,不能有重復數,如果報文中有以前使用過的隨機數,則被認為是重放攻擊
優點:雙方不需要保持時間的同步,
缺點:需要額外保存使用過的隨機數,則需要保存和查詢開銷
2,加時間戳:時戳——代表當前時刻的數
而重放的時戳將相對遠離當前時刻
優點:不需要內存開銷
缺點:通信各方的計算機時鍾必須保持同步(同步越好,受攻擊的可能性越小)
3,加流水號:雙方在報文中添加一個逐步遞增的整數,則只要收到一個不連續的流水號報文(太大或者太小)就認為有重放威脅
優點:不需要時間同步,保存的信息量小
缺點:攻擊者如果對報文解密成功,就獲得了流水號進而會偽造數據