在上文已經講述了基礎介紹,這篇文章詳細講解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是屬於高密信息,不能泄露。下面是流程圖:
在客戶端,使用服務時,為了安全性,服務這邊需要生成加密后的hash值,並且通過消息頭的方式,傳送hash值、日期、AccessKeyId到服務器。
hash值的生成:是明文字符串=當前日期+AccessKeyId,然后通過密鑰AccessKeySecret加密明文字符串,最后得到hash值。
在服務端,接受到消息頭的三個信息:當前日期、AccessKeyId、加密后的hash值。首先服務器取得當前日期,與傳送過來的日期做對比,看是否過期(10分鍾),過期則返回調用失敗。
然后使用AccessKeyId在DB或者緩存找到AccessKeySecret,生成hash加密后的字符串。再與傳送過來的hash加密后的字符串做對比,如果相等,則可以調用API,否則放回失敗信息。如下圖:
相關.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。
可以關注本人的公眾號,多年經驗的原創文章共享給大家。


