[http]http转义和加解密方法
http轉義和加解密
second60 ?20180202
1 背景
無論在客戶端還是在服務端程序中,http是用的非常之多的協議。但使用http有自已的規則,本文說的是http的轉義和加解密的方法之一
?????
2 轉義
2.1原因:
http參數中不能傳特殊字符,因為很多特殊字符內部已使用。如:= # ?等
??所以在發前前,發送的內容必須經過轉義。
??如: http://localhost:8000?name=XXX&sex=XXX&address=XXX.....
??假如:address中有特殊字符#, 那么服務端接收到后,可能轉換失敗。
?
??因此,必須先對參數進行轉義。
?
2.2 http參數特殊字符?轉義規則
有些符號在URL中是不能直接傳遞的,如果要在URL中傳遞這些特殊符號,那么就要使用他們的編碼了。編碼的格式為:%加字符的ASCII碼,即一個百分號%,后面跟對應字符的ASCII(16進制)碼值。例如 空格的編碼值是"%20"。
下表中列出了一些URL特殊符號及編碼
:替換為%3A
?
十六進制值?
1. + URL 中+號表示空格 %2B?
2. 空格 URL中的空格可以用+號或者編碼 %20?
3. / 分隔目錄和子目錄 %2F?
4. ? 分隔實際的 URL 和參數 %3F?
5. % 指定特殊字符 %25?
6. # 表示書簽 %23?
7. & URL 中指定的參數間的分隔符 %26?
8. = URL 中指定參數的值 %3D
例:要傳遞字符串“this%is#te=st&o k?+/”作為參數t傳給te.asp,則URL可以是:
te.asp?t=this%25is%23te%3Dst%26o%20k%3F%2B%2F 或者
te.asp?t=this%25is%23te%3Dst%26o+k%3F%2B%2F (空格可以用%20或+代替)
?
?
2.3 python http轉義方法
python中轉義的方法有兩種:
1.?調用urllib中quote方法,可對單個字符串進行轉義
?
2.?設用urllib中的urlendcode進行編碼,urldecode進行解碼,參數只能為map,編碼后,會輸出: key=value&key1=value1等形式
??
3 對http加解密現實
3.1 原因
3.1.1 http中的參數如果明文發送,是非常不安全的,特別是比較重要的數據
?
例如:一個簡單檢驗身份證的http請求,傳入姓名name和身份證號idno,如果明文
http://localhost:8000?name=haha&idno=445484198701021155
?
這種方法是很危險的,如果請求被人截獲了,那么信息就泄露了。
?
所以一定要加密,不論加密方法是簡單還是復雜,或自定義。
?
3.1.2 http服務器要對每次請求驗證,通過后才會處理,不能讓客戶端無限調用
?
例如:就上面那個例子,請求檢驗身份證,別人直接造一個鏈接,寫幾個線程循環,拼命去請求你的服務,你想會怎么樣。如果是幾百個幾千個線程同時請求,那么服務端的壓力是非常大的。假設檢驗身份證需去DB請求,那個大量請求,可能造成DB瓶頸。
?
如果上面的例子,加多一個token字段(加密的值),請求一來,就驗證信息的合法性,再加上,如果同一IP多次非法請求限制,就可以不影響到內部的邏輯。
3.2 加密方法
1 md5加密(重點講解)
a.??任意長度字符串md5加密后輸出的是32位長度字符串
b. ?加密用來檢驗用,相同字符串加密后的密鑰是一樣的。
c. ?MD5和雙重MD5加密,是無法反向解密的。(唯一破解方法:暴力破解)
d. ?為防止暴力破解,可以對加密的內容,加鹽處理
e. ?什么是加鹽處理:就是在需要加密的文本內容,和一串長且復雜的文本進行拼接,這樣就能防止加密后的MD5值被暴力碰撞破解。
?
使用方法:
md5(客戶端密碼) == md5(服務端DB查出的密碼)/ db存的密碼就是MD5值
?
更安全方法:
客戶端加鹽密碼 = 客戶端密碼 + 復雜長文本
服務端加鹽密碼 = 服務端DB查出的密碼 + 復雜長文本
md5(客戶端加鹽密碼) == md5(服務端加鹽密碼)/db存的密碼就是MD5值
?
DB存儲密碼的形式有兩種:
1.?原始密碼(危險,如果服務端被攻擊,數據就是明文的)
2.?加密后的密碼(安全,即使服務端泄漏,數據是密文的,全安全許多,這里不一定是md5密,可以是其他可反向解的密,對內部人員來說,是可知道原始密碼的)
?
md5非常常用,當然雙重md5會更安全。
?
2 客戶端和服務端有同一個密鑰,進行加密(對稱加密,重點講解)
a. 客戶端和服務端都有相同的一個密鑰進行加密
eg: ?key=!@#^*&*eaQW$% ?(夠復雜)
?
b. 客戶端傳過來的內容:md5(需要加密的內容+密鑰)
eg:
可反解的加密
加密后的name=XXXXX
加密后的idno=YYYYY
md5(“name=XXXXX&idno=YYYYY&key=!@#^*&*eaQW$%”) ?生成token
http://localhost:8000?name=XXXXX&idno=YYYYY&token=token值
?
c. 服務端校驗:md5(“name=XXXX&idno=XXXX&key=!@#^*&*eaQW$%”)是否和token相等
?
優點:多了個驗證,驗證通過才會處理,防止非法調用
??????如果請求被截獲,name和idno也是加密的,會比較安全
缺點:密鑰保存在客戶端本地,被破解了就不安全了
????客戶端更新密鑰麻煩
?
?
3 對2可進行優化, 由服務端下發密鑰給客戶端,密鑰有過期時效(對稱加密,重點講解)
a.?對于已驗證的用戶
b.?服務器定時客戶端一個key, 如:一分鐘一次
c.?key在服務端有過期時間,過期無效,須重新下發
d.?按2的方法加密
?
優點:密鑰是服務端下發的,不是固定的,
??????密鑰有過期時間,即使被破解,可能已經過期無效
??????????安全性會比較好
????缺點:服務端要維護密鑰和定時更新密鑰,邏輯會復雜些。
?
4 字典映射加檢驗
a.?客戶端服務端存有一份字節映射表(已加密)
b.?客戶端對發送內容映射,并得出奇偶校檢結果
c.?服務端對傳來內容反映射,并校驗
d.?成功才處理
?
優點:對信息加檢驗和密文
缺點:映射表可能被破解(可對映射表加密,或服務端加密下發)
?
????使用場景:交互協議中
?
5 自定義的其他方法(簡單,易破解)
a. ?字節偏移
b. ?字節加減
c. ?雙方定好偏移規則
?
?
4常用加密算法簡介
常用的加密算法,有三類:md5, 對稱, 非對稱,這里簡單介紹下
4.1 ?md5加密(不可逆)
4.2 ?非對稱加密算法
a.?公開密鑰 publickey
b.?私有密鑰 privatekey
c.?公開密鑰和私有密鑰是一對,如果用公開密鑰對數據加密,只有私有密鑰才能解密
d.?如果對私有密鑰進行加密,也只有公有密鑰才能解密
?
優點:比較安全
缺點:算法強度復雜
??????加解密速度慢
?
4.3 ?對稱加密算法
a 雙方使用相同鑰匙
b. 常用的算法有:BASE64、?DES、RC4、AES等。
?
--------------------------------------------------------------------------------------
后話:
?
???本文就寫到這吧,主要講的是3中的對http安全性加密方法,用的比較多的方法。也是自已的經驗積累,記錄下來,以免自已遺忘。如果不明白怎么實現,可以留言,我會給出具休的實現方法。
?
???無論是什么系統,安全是最重要的。所以設計系統或接口的時候,需多考慮下安全性,會不會有漏洞,怎么樣才能更加安全,保證服務器的安全和穩定性。如果設計時不考慮這些,那么被攻擊,數據泄露是很常見的。
?
????對于服務端來說,任何外部的請求都是不可靠的,包括客戶端請求,每個參數的檢驗,判斷,能防止大部份的攻擊。即安全了很多,同時也減輕了服務端的壓力。
?
????網上很多加密解密的庫,直接拿來用就行了。不一定要用多重雜的加解密算法,重要的是解決問題的方案。選擇最適合的方案來解決問題,才是王道。
?
?
?
?
總結
以上是生活随笔為你收集整理的[http]http转义和加解密方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在 RedHat、 CentOS、 Fe
- 下一篇: css页面一些动态效果展示