天天看點

産品經理需要了解的接口知識

作為背景産品經理,常常需要進行外部系統的對接,在設計開放平台接口過程中,往往會涉及接口傳輸安全性相關的問題,筆者在詳細的查閱大量資料後,結合自身的過往經驗,對于接口加密及簽名的相關知識做了一個系統性的總結,在友善自己查閱的同時也分享給大家做一些參考,說明不當之處歡迎指正。

接口安全性問題主要來源于幾方面考慮:

  1. 防僞裝攻擊即請求來源是否合法?(案例:在公共網絡環境中,第三方 有意或惡意 的調用我們的接口)
  2. 防篡改攻擊(案例:在公共網絡環境中,請求頭/查詢字元串/内容 在傳輸過程被修改)
  3. 防重播攻擊即請求被惡意攻擊(案例:在公共網絡環境中,請求被截獲,稍後被重放或多次重放)
  4. 防資料資訊洩漏(案例:截獲使用者登入請求,截獲到賬号、密碼等)

從實作接口安全考慮,下面分别就加密解密和簽名算法兩方面進行講解。

一、加密解密的概念與算法

1.1 為什麼需要加密解密?

在用戶端與伺服器進行互動時,必然涉及到互動的封包(或者通俗的講,請求資料與傳回資料),如果不希望封包進行明文傳輸,則需要進行封包的加密與解密。

是以加密的主要作用就是避免明文傳輸,就算被截獲封包,截獲方也不知道封包的具體内容。

1.2 對稱加密,單向加密,非對稱加密的介紹與差別

加密分為對稱加密和非對稱加密:

  • 對稱加密效率高,但是解決不了秘鑰的傳輸問題;
  • 非對稱加密可以解決這個問題,但效率不高。(其中https是綜合了對稱加密和非對稱加密算法的http協定。)

1.2.1 對稱加密

采用單鑰密的加密方法,同一個密鑰可以同時用來加密和解密,這種加密方法稱為對稱加密,也稱為單密鑰加密。

即約定一個秘鑰,用戶端使用這個秘鑰對傳輸參數進行加密并送出至服務端,服務端使用同樣的秘鑰進行解密;

1)常用的對稱加密算法:

  1. DES(Data Encryption Standard):資料加密标準,速度較快,适用于加密大量資料的場合;
  2. 3DES(Triple DES):是基于DES,對一塊資料用三個不同的密鑰進行三次加密,強度更高;
  3. AES(Advanced Encryption Standard):進階加密标準,是下一代的加密算法标準,速度快,安全級别高,支援128、192、256、512位密鑰的加密;

2)算法特征:

  1. 加密方和解密方使用同一個密鑰;
  2. 加密解密的速度比較快,适合資料比較長時的使用;
  3. 密鑰傳輸的過程不安全,且容易被破解,密鑰管理也比較麻煩;

3)加密工具:

openssl,它使用了libcrypto加密庫、libssl庫即TLS/SSL協定的實作庫等。TLS/SSL是基于會話的、實作了身份認證、資料機密性和會話完整性的TLS/SSL庫。

1.2.2 單向散列加密

單向加密又稱為不可逆加密算法,其密鑰是由加密散列函數生成的。單向散列函數一般用于産生消息摘要,密鑰加密等

1)常用的單向散列加密算法:

  1. MD5(Message Digest Algorithm 5):是RSA資料安全公司開發的一種單向雜湊演算法,非可逆,相同的明文産生相同的密文;
  2. SHA(Secure Hash Algorithm):可以對任意長度的資料運算生成一個160位的數值。其變種由SHA192,SHA256,SHA384等;
  3. CRC-32,主要用于提供校驗功能;

2)算法特征:

  1. 輸入一樣,輸出必然相同;
  2. 雪崩效應,輸入的微小改變,将會引起結果的巨大變化;
  3. 定長輸出,無論原始資料多大,結果大小都是相同的;
  4. 不可逆,無法根據特征碼還原原來的資料;

3)加密工具:

md5sum;sha1sum;openssl dgst

1.2.3 非對稱加密

非對稱加密即公鑰加密,隻有私鑰能解密。私鑰加密,隻有公鑰能解密。A首先生成一對公鑰和私鑰,然後将公鑰公開給别人加密,别人使用公鑰加密封包發送給A,A使用私鑰解密。反之相同。(發送給某人,用某人的公鑰加密。證明自己的身份,用自己的私鑰加密)

非對稱加密很少用來加密資料,速度太慢,通常用來實作身份驗證,發送方用對方的公鑰加密,可以保證資料的機密性(公鑰加密);發送方用自己的私鑰加密,可以實作身份驗證(數字簽名);

1)算法特征:

  1. 秘鑰對,公鑰(public key)和私鑰(secret key)
  2. 非對稱加密可以解決秘鑰傳輸問題,但效率不高。

基于非對稱加密的特性,又産生了以下兩個問題:

問題1:如何确認通信方證書的合法性呢?

借助于第三方機構:CA(Certificate Authority)。CA為每個使用公開密鑰的使用者簽發一個含CA簽名的證書,該證書的作用是證明證書中的使用者合法擁有證書中的公開密鑰,CA機構的數字簽名使得攻擊者不能僞造和篡改證書。

CA自身也擁有一個證書和私鑰。任何人都可以得到CA的證書,并用該證書驗證它所簽發證書有效性。

假設機構A向CA發出一個證書簽發請求:(證書簽發流程)

  1. CA首先生成一對公鑰和私鑰,并自簽署一個CA憑證certificate;
  2. A向CA提供自己的基本資訊和自己的公鑰;
  3. CA先對A的基本資訊和公鑰計算一個特征碼,然後再使用自己的私鑰對特征碼進行加密,加密生成的字元串(數字簽名)、A的公鑰、A的基本資訊共同組成了CA簽發的數字證書;

有了CA簽發的數字證書,就可以通過CA來确認證書擁有者的身份,也就解決了通信中身份确認的問題。

問題2:通過CA實作了身份驗證,那如何保證資料的機密性呢?

保證資料的機密性,無非就是給資料加密,非對稱加密的加密速度慢,不适合對通信資料進行加密,而在實際通信過程中,身份确認完畢之後,通常使用對稱加密方式來加密資料。那如何協商對稱加密的秘鑰呢?通常有以下兩種方法。

方法1:秘鑰交換(Internet Key Exchange, IKE)算法

Diffie-Hellman算法秘鑰協商流程,假設A/B雙發進行通信,

1) A/B通信前,先生成p,g兩個大素數,作為生成數

2) A標明一個數x,B標明一個數y

3) A/B加密結果如下:

  • A加密之後傳遞給B的内容: g^x%p –> B
  • B加密之後傳遞給A的内容: g^y%p –> A

注意:網際網路上的使用者可以看到:p,g,g^x%p,g^y%p

4) A/B獲得到資料之後解密得到相同的結果

  • A: (g^x%p)^x=g^xy%p
  • B: (g^y%p)^y=g^xy%p

這樣A/B就協商出了一個共同的秘鑰g^xy%p,A/B雙方使用非對稱加密确認完身份之後,就可以是用該秘鑰加密通信資料了。

方法2:公鑰加密的方式協商秘鑰

1) A随機生成一個字元串STR作為秘鑰,A先使用自己的私鑰加密STR得到STR1,A再使用B的公鑰加密得到STR2,A将STR2發送給B;

2) B接收到STR2,先使用B的私鑰解密,再使用A的公鑰解密,最後得到秘鑰STR;

這樣A、B就完成了秘鑰的協商,協商的秘鑰為随機字元串STR。

常用的非對稱加密算法

  • RSA:由 RSA公司發明,是一個支援變長密鑰的公共密鑰算法,需要加密的檔案塊的長度也是可變的;既可以實作加密,又可以實作簽名
  • DSA(Digital Signature Algorithm):數字簽名算法,是一種标準的 DSS(數字簽名标準);
  • ECC(Elliptic Curves Cryptography):橢圓曲線密碼編碼;

ECC和RSA相比,在許多方面都有對絕對的優勢,主要展現在以下方面:

  1. 抗攻擊性強,相同的密鑰長度,其抗攻擊性要強很多倍。
  2. 計算量小,處理速度快。ECC總的速度比RSA、DSA要快得多。
  3. 存儲空間占用小,ECC的密鑰尺寸和系統參數與RSA、DSA相比要小得多,意味着它所占的存貯空間要小得多。這對于加密算法在IC卡上的應用具有特别重要的意義。
  4. 帶寬要求低,當對長消息進行加解密時,三類密碼系統有相同的帶寬要求,但應用于短消息時ECC帶寬要求卻低得多。帶寬要求低使ECC在無線網絡領域具有廣泛的應用前景。

1.3 加密算法

(1)DES加密算法

DES加密算法是一種分組密碼,以64位為分組對資料加密,它的密鑰長度是56位,加密解密用同一算法。

DES加密算法是對密鑰進行保密,而公開算法,包括加密和解密算法。這樣,隻有掌握了和發送方相同密鑰的人才能解讀由DES加密算法加密的密文資料。

是以,破譯DES加密算法實際上就是搜尋密鑰的編碼。對于56位長度的密鑰來說,如果用窮舉法來進行搜尋的話,其運算次數為256。

随着計算機系統能力的不斷發展,DES的安全性比它剛出現時會弱得多,然而從非關鍵性質的實際出發,仍可以認為它是足夠的。不過,DES現在僅用于舊系統的鑒定,而更多地選擇新的加密标準。

(2)AES加密算法

ES加密算法是密碼學中的進階加密标準,該加密算法采用對稱分組密碼體制,密鑰長度的最少支援為128、192、256,分組長度128位,算法應易于各種硬體和軟體實作。

這種加密算法是美國聯邦政府采用的區塊加密标準,這個标準用來替代原先的DES,已經被多方分析且廣為全世界所使用。

AES加密算法被設計為支援128/192/256位(/32=nb)資料塊大小(即分組長度);支援128/192/256位(/32=nk)密碼長度,,在10進制裡,對應34×1038、62×1057、1.1×1077個密鑰。

(3)RSA加密算法

RSA加密算法是目前最有影響力的公鑰加密算法,并且被普遍認為是目前最優秀的公鑰方案之一。

RSA是第一個能同時用于加密和數宇簽名的算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被ISO推薦為公鑰資料加密标準。

RSA加密算法基于一個十分簡單的數論事實:将兩個大素數相乘十分容易,但那時想要,但那時想要對其乘積進行因式分解卻極其困難,是以可以将乘積公開作為加密密鑰。

(4)Base64加密算法

Base64加密算法是網絡上最常見的用于傳輸8bit位元組代碼的編碼方式之一,Base64編碼可用于在HTTP環境下傳遞較長的辨別資訊。

例如,在JAVAPERSISTENCE系統HIBEMATE中,采用了Base64來将一個較長的唯一辨別符編碼為一個字元串,用作HTTP表單和HTTPGETURL中的參數。

在其他應用程式中,也常常需要把二進制資料編碼為适合放在URL(包括隐藏表單域)中的形式。此時,采用Base64編碼不僅比較簡短,同時也具有不可讀性,即所編碼的資料不會被人用肉眼所直接看到。

(5)MD5加密算法

MD5為計算機安全領域廣泛使用的一種散列函數,用以提供消息的完整性保護。

對MD5加密算法簡要的叙述可以為:MD5以512位分組來處理輸入的資訊,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,算法的輸出由四個32位分組組成,将這四個32位分組級聯後将生成—個128位散列值。

MD5被廣泛用于各種軟體的密碼認證和鑰匙識别上。MD5用的是哈希函數,它的典型應用是對一段資訊産生資訊摘要,以防止被篡改。

MD5的典型應用是對一段Message産生fingerprin指紋,以防止被“篡改”。如果再有—個第三方的認證機構,用MD5還可以防止檔案作者的“抵賴”,這就是所謂的數字簽名應用。

MD5還廣泛用于作業系統的登陸認證上,如UNIX、各類BSD系統登入密碼、數字簽名等

二、簽名的概念與方法

2.1 為什麼要簽名?

1) 在用戶端與伺服器進行互動時,封包雖然加密了,但我們并不能确認這個封包是誰發過來的。例如,與第三方伺服器B進行互動時,我方收到了一個已加密的請求,但我方并不能确認是伺服器B發送的這個封包,此時我們可以用數字簽名的方式來進行驗證。作用:認證資料來源

2) 如果我方收到一個B伺服器簽名的請求,那麼B伺服器也無法否認這個請求,因為帶有它的簽名,作用:抗否認性。

3) 我方收到一個B伺服器簽名的請求,但我方并不能确認這個請求是否被篡改過(雖然封包加了密,也可能被篡改),此時即可用簽名,驗證簽名中的封包與傳過來的封包是否一緻。作用:保證了資料的完整性

2.2 簽名算法過程

簽名的方式多種多樣,常見的形式如下:

2.2.1 APPKEY+簽名認證

1) 對除簽名外的所有請求參數按key做的升序排列,value無需編碼。(假設目前時間的時間戳是12345678)

例如:有c=3,b=2,a=1 三個參,另加上時間戳後, 按key排序後為:a=1,b=2,c=3,_timestamp=12345678。

2) 把參數名和參數值連接配接成字元串,得到拼裝字元:a1b2c3_timestamp12345678

3) 用申請到的appkey 連接配接到接拼裝字元串頭部和尾部,然後進行32位MD5加密,最後将到得MD5加密摘要轉化成大寫。

示例:假設appkey=test,md5(testa1b2c3_timestamp12345678test),取得MD5摘要值 C5F3EB5D7DC2748AED89E90AF00081E6 。

風險在于一但appkey被别人擷取,即可仿照簽名,造成安全性問題

2.2.2 token+簽名認證

token+簽名認證的主要原理是:

1) 做一個認證服務,提供一個認證的webapi,使用者送出相關身份資訊如供應商編碼,先通路它

2) 服務端收到請求,去驗證相關身份資訊,驗證成功後,服務端會簽發一個token,token一般可以存儲在緩存或資料庫中,以友善後面查詢出來進行驗證。再把這個 Token 發送給用戶端

3) 用戶端收到 token 以後可以把它存儲起來,比如放在 Cookie 裡或者 Local Storage 裡;用戶端每次向服務端請求資源的時候拿着相應的token以及請求的參數和伺服器端提供的簽名算法計算出簽名後再去通路指定的api,服務端收到請求,就擷取對應使用者的token和請求參數,伺服器端再次計算簽名和用戶端簽名做對比,如果驗證通過則正常通路相應的api,驗證失敗則傳回具體的失敗資訊.

安全的關鍵在于參與簽名的token,整個過程中token是不參與通信的,是以隻要保證token不洩露,請求就不會被僞造。然後我們通過timestamp時間戳用來驗證請求是否過期,這樣就算被人拿走完整的請求連結也是無效的。

2.2.3 https模式

追求安全可以考慮https的雙向驗證模式 + 參數的sign簽名的規則雙重驗證達到安全的請求背景。