產(chǎn)品經(jīng)理需要了解的接口知識(shí)
作為后臺(tái)產(chǎn)品經(jīng)理,常常需要進(jìn)行外部系統(tǒng)的對(duì)接,在設(shè)計(jì)開放平臺(tái)接口過程中,往往會(huì)涉及接口傳輸安全性相關(guān)的問題,筆者在詳細(xì)的查閱大量資料后,結(jié)合自身的過往經(jīng)驗(yàn),對(duì)于接口加密及簽名的相關(guān)知識(shí)做了一個(gè)系統(tǒng)性的總結(jié),在方便自己查閱的同時(shí)也分享給大家做一些參考,說明不當(dāng)之處歡迎指正。
接口安全性問題主要來源于幾方面考慮:
- 防偽裝攻擊即請求來源是否合法?(案例:在公共網(wǎng)絡(luò)環(huán)境中,第三方 有意或惡意 的調(diào)用我們的接口)
- 防篡改攻擊(案例:在公共網(wǎng)絡(luò)環(huán)境中,請求頭/查詢字符串/內(nèi)容 在傳輸過程被修改)
- 防重放攻擊即請求被惡意攻擊(案例:在公共網(wǎng)絡(luò)環(huán)境中,請求被截獲,稍后被重放或多次重放)
- 防數(shù)據(jù)信息泄漏(案例:截獲用戶登錄請求,截獲到賬號(hào)、密碼等)
從實(shí)現(xiàn)接口安全考慮,下面分別就加密解密和簽名算法兩方面進(jìn)行講解。
一、加密解密的概念與算法
1.1 為什么需要加密解密?
在客戶端與服務(wù)器進(jìn)行交互時(shí),必然涉及到交互的報(bào)文(或者通俗的講,請求數(shù)據(jù)與返回?cái)?shù)據(jù)),如果不希望報(bào)文進(jìn)行明文傳輸,則需要進(jìn)行報(bào)文的加密與解密。
所以加密的主要作用就是避免明文傳輸,就算被截獲報(bào)文,截獲方也不知道報(bào)文的具體內(nèi)容。
1.2 對(duì)稱加密,單向加密,非對(duì)稱加密的介紹與區(qū)別
加密分為對(duì)稱加密和非對(duì)稱加密:
- 對(duì)稱加密效率高,但是解決不了秘鑰的傳輸問題;
- 非對(duì)稱加密可以解決這個(gè)問題,但效率不高。(其中https是綜合了對(duì)稱加密和非對(duì)稱加密算法的http協(xié)議。)
1.2.1 對(duì)稱加密
采用單鑰密的加密方法,同一個(gè)密鑰可以同時(shí)用來加密和解密,這種加密方法稱為對(duì)稱加密,也稱為單密鑰加密。
即約定一個(gè)秘鑰,客戶端使用這個(gè)秘鑰對(duì)傳輸參數(shù)進(jìn)行加密并提交至服務(wù)端,服務(wù)端使用同樣的秘鑰進(jìn)行解密;
1)常用的對(duì)稱加密算法:
- DES(Data Encryption Standard):數(shù)據(jù)加密標(biāo)準(zhǔn),速度較快,適用于加密大量數(shù)據(jù)的場合;
- 3DES(Triple DES):是基于DES,對(duì)一塊數(shù)據(jù)用三個(gè)不同的密鑰進(jìn)行三次加密,強(qiáng)度更高;
- AES(Advanced Encryption Standard):高級(jí)加密標(biāo)準(zhǔn),是下一代的加密算法標(biāo)準(zhǔn),速度快,安全級(jí)別高,支持128、192、256、512位密鑰的加密;
2)算法特征:
- 加密方和解密方使用同一個(gè)密鑰;
- 加密解密的速度比較快,適合數(shù)據(jù)比較長時(shí)的使用;
- 密鑰傳輸?shù)倪^程不安全,且容易被破解,密鑰管理也比較麻煩;
3)加密工具:
openssl,它使用了libcrypto加密庫、libssl庫即TLS/SSL協(xié)議的實(shí)現(xiàn)庫等。TLS/SSL是基于會(huì)話的、實(shí)現(xiàn)了身份認(rèn)證、數(shù)據(jù)機(jī)密性和會(huì)話完整性的TLS/SSL庫。
1.2.2 單向散列加密
單向加密又稱為不可逆加密算法,其密鑰是由加密散列函數(shù)生成的。單向散列函數(shù)一般用于產(chǎn)生消息摘要,密鑰加密等
1)常用的單向散列加密算法:
- MD5(Message Digest Algorithm 5):是RSA數(shù)據(jù)安全公司開發(fā)的一種單向散列算法,非可逆,相同的明文產(chǎn)生相同的密文;
- SHA(Secure Hash Algorithm):可以對(duì)任意長度的數(shù)據(jù)運(yùn)算生成一個(gè)160位的數(shù)值。其變種由SHA192,SHA256,SHA384等;
- CRC-32,主要用于提供校驗(yàn)功能;
2)算法特征:
- 輸入一樣,輸出必然相同;
- 雪崩效應(yīng),輸入的微小改變,將會(huì)引起結(jié)果的巨大變化;
- 定長輸出,無論原始數(shù)據(jù)多大,結(jié)果大小都是相同的;
- 不可逆,無法根據(jù)特征碼還原原來的數(shù)據(jù);
3)加密工具:
md5sum;sha1sum;openssl dgst
1.2.3 非對(duì)稱加密
非對(duì)稱加密即公鑰加密,只有私鑰能解密。私鑰加密,只有公鑰能解密。A首先生成一對(duì)公鑰和私鑰,然后將公鑰公開給別人加密,別人使用公鑰加密報(bào)文發(fā)送給A,A使用私鑰解密。反之相同。(發(fā)送給某人,用某人的公鑰加密。證明自己的身份,用自己的私鑰加密)
非對(duì)稱加密很少用來加密數(shù)據(jù),速度太慢,通常用來實(shí)現(xiàn)身份驗(yàn)證,發(fā)送方用對(duì)方的公鑰加密,可以保證數(shù)據(jù)的機(jī)密性(公鑰加密);發(fā)送方用自己的私鑰加密,可以實(shí)現(xiàn)身份驗(yàn)證(數(shù)字簽名);
1)算法特征:
- 秘鑰對(duì),公鑰(public key)和私鑰(secret key)
- 非對(duì)稱加密可以解決秘鑰傳輸問題,但效率不高。
基于非對(duì)稱加密的特性,又產(chǎn)生了以下兩個(gè)問題:
問題1:如何確認(rèn)通信方證書的合法性呢?
借助于第三方機(jī)構(gòu):CA(Certificate Authority)。CA為每個(gè)使用公開密鑰的用戶簽發(fā)一個(gè)含CA簽名的證書,該證書的作用是證明證書中的用戶合法擁有證書中的公開密鑰,CA機(jī)構(gòu)的數(shù)字簽名使得攻擊者不能偽造和篡改證書。
CA自身也擁有一個(gè)證書和私鑰。任何人都可以得到CA的證書,并用該證書驗(yàn)證它所簽發(fā)證書有效性。
假設(shè)機(jī)構(gòu)A向CA發(fā)出一個(gè)證書簽發(fā)請求:(證書簽發(fā)流程)
- CA首先生成一對(duì)公鑰和私鑰,并自簽署一個(gè)CA證書certificate;
- A向CA提供自己的基本信息和自己的公鑰;
- CA先對(duì)A的基本信息和公鑰計(jì)算一個(gè)特征碼,然后再使用自己的私鑰對(duì)特征碼進(jìn)行加密,加密生成的字符串(數(shù)字簽名)、A的公鑰、A的基本信息共同組成了CA簽發(fā)的數(shù)字證書;
有了CA簽發(fā)的數(shù)字證書,就可以通過CA來確認(rèn)證書擁有者的身份,也就解決了通信中身份確認(rèn)的問題。
問題2:通過CA實(shí)現(xiàn)了身份驗(yàn)證,那如何保證數(shù)據(jù)的機(jī)密性呢?
保證數(shù)據(jù)的機(jī)密性,無非就是給數(shù)據(jù)加密,非對(duì)稱加密的加密速度慢,不適合對(duì)通信數(shù)據(jù)進(jìn)行加密,而在實(shí)際通信過程中,身份確認(rèn)完畢之后,通常使用對(duì)稱加密方式來加密數(shù)據(jù)。那如何協(xié)商對(duì)稱加密的秘鑰呢?通常有以下兩種方法。
方法1:秘鑰交換(Internet Key Exchange, IKE)算法
Diffie-Hellman算法秘鑰協(xié)商流程,假設(shè)A/B雙發(fā)進(jìn)行通信,
1) A/B通信前,先生成p,g兩個(gè)大素?cái)?shù),作為生成數(shù)
2) A選定一個(gè)數(shù)x,B選定一個(gè)數(shù)y
3) A/B加密結(jié)果如下:
- A加密之后傳遞給B的內(nèi)容: g^x%p –> B
- B加密之后傳遞給A的內(nèi)容: g^y%p –> A
注意:互聯(lián)網(wǎng)上的用戶可以看到:p,g,g^x%p,g^y%p
4) A/B獲得到數(shù)據(jù)之后解密得到相同的結(jié)果
- A: (g^x%p)^x=g^xy%p
- B: (g^y%p)^y=g^xy%p
這樣A/B就協(xié)商出了一個(gè)共同的秘鑰g^xy%p,A/B雙方使用非對(duì)稱加密確認(rèn)完身份之后,就可以是用該秘鑰加密通信數(shù)據(jù)了。
方法2:公鑰加密的方式協(xié)商秘鑰
1) A隨機(jī)生成一個(gè)字符串STR作為秘鑰,A先使用自己的私鑰加密STR得到STR1,A再使用B的公鑰加密得到STR2,A將STR2發(fā)送給B;
2) B接收到STR2,先使用B的私鑰解密,再使用A的公鑰解密,最后得到秘鑰STR;
這樣A、B就完成了秘鑰的協(xié)商,協(xié)商的秘鑰為隨機(jī)字符串STR。
常用的非對(duì)稱加密算法
- RSA:由 RSA公司發(fā)明,是一個(gè)支持變長密鑰的公共密鑰算法,需要加密的文件塊的長度也是可變的;既可以實(shí)現(xiàn)加密,又可以實(shí)現(xiàn)簽名
- DSA(Digital Signature Algorithm):數(shù)字簽名算法,是一種標(biāo)準(zhǔn)的 DSS(數(shù)字簽名標(biāo)準(zhǔn));
- ECC(Elliptic Curves Cryptography):橢圓曲線密碼編碼;
ECC和RSA相比,在許多方面都有對(duì)絕對(duì)的優(yōu)勢,主要體現(xiàn)在以下方面:
- 抗攻擊性強(qiáng),相同的密鑰長度,其抗攻擊性要強(qiáng)很多倍。
- ?計(jì)算量小,處理速度快。ECC總的速度比RSA、DSA要快得多。
- 存儲(chǔ)空間占用小,ECC的密鑰尺寸和系統(tǒng)參數(shù)與RSA、DSA相比要小得多,意味著它所占的存貯空間要小得多。這對(duì)于加密算法在IC卡上的應(yīng)用具有特別重要的意義。
- 帶寬要求低,當(dāng)對(duì)長消息進(jìn)行加解密時(shí),三類密碼系統(tǒng)有相同的帶寬要求,但應(yīng)用于短消息時(shí)ECC帶寬要求卻低得多。帶寬要求低使ECC在無線網(wǎng)絡(luò)領(lǐng)域具有廣泛的應(yīng)用前景。
1.3 加密算法
(1)DES加密算法
DES加密算法是一種分組密碼,以64位為分組對(duì)數(shù)據(jù)加密,它的密鑰長度是56位,加密解密用同一算法。
DES加密算法是對(duì)密鑰進(jìn)行保密,而公開算法,包括加密和解密算法。這樣,只有掌握了和發(fā)送方相同密鑰的人才能解讀由DES加密算法加密的密文數(shù)據(jù)。
因此,破譯DES加密算法實(shí)際上就是搜索密鑰的編碼。對(duì)于56位長度的密鑰來說,如果用窮舉法來進(jìn)行搜索的話,其運(yùn)算次數(shù)為256。
隨著計(jì)算機(jī)系統(tǒng)能力的不斷發(fā)展,DES的安全性比它剛出現(xiàn)時(shí)會(huì)弱得多,然而從非關(guān)鍵性質(zhì)的實(shí)際出發(fā),仍可以認(rèn)為它是足夠的。不過,DES現(xiàn)在僅用于舊系統(tǒng)的鑒定,而更多地選擇新的加密標(biāo)準(zhǔn)。
(2)AES加密算法
ES加密算法是密碼學(xué)中的高級(jí)加密標(biāo)準(zhǔn),該加密算法采用對(duì)稱分組密碼體制,密鑰長度的最少支持為128、192、256,分組長度128位,算法應(yīng)易于各種硬件和軟件實(shí)現(xiàn)。
這種加密算法是美國聯(lián)邦政府采用的區(qū)塊加密標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。
AES加密算法被設(shè)計(jì)為支持128/192/256位(/32=nb)數(shù)據(jù)塊大小(即分組長度);支持128/192/256位(/32=nk)密碼長度,,在10進(jìn)制里,對(duì)應(yīng)34×1038、62×1057、1.1×1077個(gè)密鑰。
(3)RSA加密算法
RSA加密算法是目前最有影響力的公鑰加密算法,并且被普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之一。
RSA是第一個(gè)能同時(shí)用于加密和數(shù)宇簽名的算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。
RSA加密算法基于一個(gè)十分簡單的數(shù)論事實(shí):將兩個(gè)大素?cái)?shù)相乘十分容易,但那時(shí)想要,但那時(shí)想要對(duì)其乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
(4)Base64加密算法
Base64加密算法是網(wǎng)絡(luò)上最常見的用于傳輸8bit字節(jié)代碼的編碼方式之一,Base64編碼可用于在HTTP環(huán)境下傳遞較長的標(biāo)識(shí)信息。
例如,在JAVAPERSISTENCE系統(tǒng)HIBEMATE中,采用了Base64來將一個(gè)較長的唯一標(biāo)識(shí)符編碼為一個(gè)字符串,用作HTTP表單和HTTPGETURL中的參數(shù)。
在其他應(yīng)用程序中,也常常需要把二進(jìn)制數(shù)據(jù)編碼為適合放在URL(包括隱藏表單域)中的形式。此時(shí),采用Base64編碼不僅比較簡短,同時(shí)也具有不可讀性,即所編碼的數(shù)據(jù)不會(huì)被人用肉眼所直接看到。
(5)MD5加密算法
MD5為計(jì)算機(jī)安全領(lǐng)域廣泛使用的一種散列函數(shù),用以提供消息的完整性保護(hù)。
對(duì)MD5加密算法簡要的敘述可以為:MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個(gè)32位子分組,經(jīng)過了一系列的處理后,算法的輸出由四個(gè)32位分組組成,將這四個(gè)32位分組級(jí)聯(lián)后將生成—個(gè)128位散列值。
MD5被廣泛用于各種軟件的密碼認(rèn)證和鑰匙識(shí)別上。MD5用的是哈希函數(shù),它的典型應(yīng)用是對(duì)一段信息產(chǎn)生信息摘要,以防止被篡改。
MD5的典型應(yīng)用是對(duì)一段Message產(chǎn)生fingerprin指紋,以防止被“篡改”。如果再有—個(gè)第三方的認(rèn)證機(jī)構(gòu),用MD5還可以防止文件作者的“抵賴”,這就是所謂的數(shù)字簽名應(yīng)用。
MD5還廣泛用于操作系統(tǒng)的登陸認(rèn)證上,如UNIX、各類BSD系統(tǒng)登錄密碼、數(shù)字簽名等
二、簽名的概念與方法
2.1 為什么要簽名?
1) 在客戶端與服務(wù)器進(jìn)行交互時(shí),報(bào)文雖然加密了,但我們并不能確認(rèn)這個(gè)報(bào)文是誰發(fā)過來的。例如,與第三方服務(wù)器B進(jìn)行交互時(shí),我方收到了一個(gè)已加密的請求,但我方并不能確認(rèn)是服務(wù)器B發(fā)送的這個(gè)報(bào)文,此時(shí)我們可以用數(shù)字簽名的方式來進(jìn)行驗(yàn)證。作用:認(rèn)證數(shù)據(jù)來源
2) 如果我方收到一個(gè)B服務(wù)器簽名的請求,那么B服務(wù)器也無法否認(rèn)這個(gè)請求,因?yàn)閹в兴暮灻?,作用:抗否認(rèn)性。
3) 我方收到一個(gè)B服務(wù)器簽名的請求,但我方并不能確認(rèn)這個(gè)請求是否被篡改過(雖然報(bào)文加了密,也可能被篡改),此時(shí)即可用簽名,驗(yàn)證簽名中的報(bào)文與傳過來的報(bào)文是否一致。作用:保證了數(shù)據(jù)的完整性
2.2 簽名算法過程
簽名的方式多種多樣,常見的形式如下:
2.2.1 APPKEY+簽名認(rèn)證
1) 對(duì)除簽名外的所有請求參數(shù)按key做的升序排列,value無需編碼。(假設(shè)當(dāng)前時(shí)間的時(shí)間戳是12345678)
例如:有c=3,b=2,a=1 三個(gè)參,另加上時(shí)間戳后, 按key排序后為:a=1,b=2,c=3,_timestamp=12345678。
2) 把參數(shù)名和參數(shù)值連接成字符串,得到拼裝字符:a1b2c3_timestamp12345678
3) 用申請到的appkey 連接到接拼裝字符串頭部和尾部,然后進(jìn)行32位MD5加密,最后將到得MD5加密摘要轉(zhuǎn)化成大寫。
示例:假設(shè)appkey=test,md5(testa1b2c3_timestamp12345678test),取得MD5摘要值 C5F3EB5D7DC2748AED89E90AF00081E6 。
風(fēng)險(xiǎn)在于一但appkey被別人獲取,即可仿照簽名,造成安全性問題
2.2.2 token+簽名認(rèn)證
token+簽名認(rèn)證的主要原理是:
1) 做一個(gè)認(rèn)證服務(wù),提供一個(gè)認(rèn)證的webapi,用戶提交相關(guān)身份信息如供應(yīng)商編碼,先訪問它
2) 服務(wù)端收到請求,去驗(yàn)證相關(guān)身份信息,驗(yàn)證成功后,服務(wù)端會(huì)簽發(fā)一個(gè)token,token一般可以存儲(chǔ)在緩存或數(shù)據(jù)庫中,以方便后面查詢出來進(jìn)行驗(yàn)證。再把這個(gè) Token 發(fā)送給客戶端
3) 客戶端收到 token 以后可以把它存儲(chǔ)起來,比如放在 Cookie 里或者 Local Storage 里;客戶端每次向服務(wù)端請求資源的時(shí)候拿著相應(yīng)的token以及請求的參數(shù)和服務(wù)器端提供的簽名算法計(jì)算出簽名后再去訪問指定的api,服務(wù)端收到請求,就獲取對(duì)應(yīng)用戶的token和請求參數(shù),服務(wù)器端再次計(jì)算簽名和客戶端簽名做對(duì)比,如果驗(yàn)證通過則正常訪問相應(yīng)的api,驗(yàn)證失敗則返回具體的失敗信息.
安全的關(guān)鍵在于參與簽名的token,整個(gè)過程中token是不參與通信的,所以只要保證token不泄露,請求就不會(huì)被偽造。然后我們通過timestamp時(shí)間戳用來驗(yàn)證請求是否過期,這樣就算被人拿走完整的請求鏈接也是無效的。
2.2.3 https模式
追求安全可以考慮https的雙向驗(yàn)證模式 + 參數(shù)的sign簽名的規(guī)則雙重驗(yàn)證達(dá)到安全的請求后臺(tái)
本文由 @不橈 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自 Unsplash,基于 CC0 協(xié)議
非計(jì)算機(jī)專業(yè)產(chǎn)品經(jīng)理,我竟然看懂了??
Base64不是加密算法,只是一種編碼轉(zhuǎn)換。
MD5很容易破解,一般不會(huì)用在加密,經(jīng)常用于校驗(yàn)文件是否被篡改。
信息安全專業(yè)的我看著很親切,但感覺有點(diǎn)太過細(xì)節(jié)了,平常的產(chǎn)品工作不需要涉及這么細(xì)的概念和數(shù)據(jù)。
現(xiàn)在發(fā)現(xiàn),大學(xué)學(xué)的知識(shí)是有用的??????
我也覺得,然而非計(jì)算機(jī)專業(yè)的看得我云里霧里
非計(jì)算機(jī)+1看了兩遍還是云里霧里 ??