如何設計提高服務API的安全性(二)API密鑰方式詳解


在上文已經講述了基礎介紹,這篇文章詳細講解API密鑰方式。

 

利用何種加密方式呢?

      經過上面加密算法的理解,單向加密不僅性能高,而且有壓縮性,即長度一致,有效減少網絡傳輸過程中的字節大小。適合我們這種調用服務API的方式。所以我們使用不可逆的加密算法,選擇SHA。

      因為服務API是供所有企業/個人使用,一個企業/個人可理解為一個租戶。如果都使用SHA來加密日期+AccessKeyId的話,不安全。所以需要用密鑰生成,就需要用到HMAC算法。HMAC即利用密鑰來生成固定長度的hash加密值,提高安全性。即做了兩層防御。第一層使用SHA,第二層使用HMAC。所以有很流行的HMACSHA加密算法,即他們的結合體,HMAC為SHA加鹽。

 

根據需求,為何使用這種模式?

      第一,時間有效性。利用日期字段來降低加密后的密鑰被盜用的風險。傳輸過程中,即使給盜用傳輸值,也只有xx分鍾(這里設置10分鍾)的有效期。

      第二,效率快,耗CPU少。單向加密性能較高,無需解密。

      第三,所有平台代碼通用。例如c#、java、python等。

 

流程詳解

      在使用服務前,首先企業/個人需要登陸我們的系統,來進行用戶注冊。注冊完成之后,申請我們的服務使用。申請服務使用成功后,會給到用戶調用服務API的兩個關鍵密鑰信息AccessKeyId、AccessKeySecret。AccessKeyId是密鑰的Id,AccessKeySecret是密鑰值,所以AccessKeySecret是屬於高密信息,不能泄露。下面是流程圖:

clipboard

 

      在客戶端,使用服務時,為了安全性,服務這邊需要生成加密后的hash值,並且通過消息頭的方式,傳送hash值、日期、AccessKeyId到服務器。

      hash值的生成:是明文字符串=當前日期+AccessKeyId,然后通過密鑰AccessKeySecret加密明文字符串,最后得到hash值。

      在服務端,接受到消息頭的三個信息:當前日期、AccessKeyId、加密后的hash值。首先服務器取得當前日期,與傳送過來的日期做對比,看是否過期(10分鍾),過期則返回調用失敗。

      然后使用AccessKeyId在DB或者緩存找到AccessKeySecret,生成hash加密后的字符串。再與傳送過來的hash加密后的字符串做對比,如果相等,則可以調用API,否則放回失敗信息。如下圖:

clipboard

 

相關.net core代碼展示(.net代碼也一樣)

生成HMAC SHA265:

/// <summary>

/// Hmac Sha256加密

/// </summary>

/// <param name="text"></param>

/// <param name="key"></param>

/// <returns></returns>

public static string GetHash(string text, string key)

{

UTF8Encoding encoding = new UTF8Encoding();

Byte[] textBytes = encoding.GetBytes(text);

Byte[] keyBytes = encoding.GetBytes(key);

Byte[] hashBytes;

using (HMACSHA256 hash = new HMACSHA256(keyBytes))

hashBytes = hash.ComputeHash(textBytes);

return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();

}

 

總結

      在上述過程中,你可以使用租戶Id來替換AccessKeyId來提高安全性。如果這樣還覺得不安全,可以用可逆加密算法,對AccessKeyId進行加密后傳輸。

      上述過程利用了HMACSHA加密算法,對日期與AccessKeyId進行了加密。再利用日期來提高被盜用的安全性。

      我們這里使用的SHA是使用SHA256算法。目前國內很多公司是使用SHA1。

 

 

可以關注本人的公眾號,多年經驗的原創文章共享給大家。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM