這篇文章主要講解了“ASP.NET MVC OR WebAPI的接口安全怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“ASP.NET MVC OR WebAPI的接口安全怎么實(shí)現(xiàn)”吧!
在雙清等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站,成都外貿(mào)網(wǎng)站建設(shè)公司,雙清網(wǎng)站建設(shè)費(fèi)用合理。當(dāng)我們開(kāi)發(fā)一款A(yù)pp的時(shí)候,App需要跟后臺(tái)服務(wù)進(jìn)行通信獲取或者提交數(shù)據(jù)。
如果我們沒(méi)有完善的安全機(jī)制則很容易被別用心的人偽造請(qǐng)求而篡改數(shù)據(jù)。
所以我們需要使用某種安全機(jī)制來(lái)保證請(qǐng)求的合法?,F(xiàn)在最常用的辦法是給每個(gè)http請(qǐng)求添加一個(gè)簽名,服務(wù)端來(lái)驗(yàn)證簽名的合法性,如果簽名合法則執(zhí)行響應(yīng)的操作,如果簽名非法則直接拒絕請(qǐng)求。
簽名算法
簽名算法一般都使用Hash散列算法,常用的有MD5,SHA系列算法。這些算法可以根據(jù)不同的輸入,計(jì)算出不同的結(jié)果,而且碰撞的概率很低。
簽名算法跟加密算法不是一回事。很多同學(xué)都會(huì)說(shuō)使用MD5加密一下,其實(shí)這是錯(cuò)誤的。簽名算法不能恢復(fù)原來(lái)的數(shù)據(jù),因?yàn)樗旧聿⒉话瓉?lái)數(shù)據(jù)的信息。
而加密方法不同,加密方法是可以根據(jù)加密結(jié)果重新推算出原來(lái)的數(shù)據(jù)的。
HMAC SHA作為一種更加安全的簽名算法,使用一個(gè)Key來(lái)影響簽名的結(jié)果。這樣同樣的輸入配合不同的Key可以得出不同的簽名,更加安全。
public static string HmacSHA256(string secretKey,string plain)
{
var keyBytes = Encoding.UTF8.GetBytes(secretKey);
var plainBytes = Encoding.UTF8.GetBytes(plain);
using (var hmacsha256 = new HMACSHA256(keyBytes))
{
var sb = new StringBuilder();
var hashValue = hmacsha256.ComputeHash(plainBytes);
foreach (byte x in hashValue)
{
sb.Append(String.Format("{0:x2}", x));
}
return sb.ToString();
}
}
簽名的參數(shù)
有了簽名算法,那么我們簽名的內(nèi)容哪里來(lái)呢?
一般我們使用http請(qǐng)求的queryString然后加上時(shí)間戳還有隨機(jī)數(shù)來(lái)作為簽名的參數(shù)。
public static string MakeSignPlain(SortedDictionary queryString,string time,string random )
{
var sb = new StringBuilder();
foreach (var keyValue in queryString)
{
sb.AppendFormat("{0}={1}&", keyValue.Key, keyValue.Value);
}
if (sb.Length>1)
{
sb.Remove(sb.Length - 1, 1);
}
sb.Append(time);
sb.Append(random);
return sb.ToString().ToUpper();
}
驗(yàn)證簽名
驗(yàn)證簽名就是簡(jiǎn)單的比較服務(wù)端生產(chǎn)的簽名跟客戶端生產(chǎn)的簽名是否一直。
要注意的一點(diǎn)是最好驗(yàn)證下時(shí)間戳,跟服務(wù)端時(shí)間比較前后不能相差5分鐘。這也是一個(gè)簡(jiǎn)單的防Replay Attack的手段。
public static bool Valid(string requestSign,string signPlain,string time, string secretKey)
{
if (string.IsNullOrEmpty(time)||string.IsNullOrEmpty(requestSign)||string.IsNullOrEmpty(signPlain))
{
return false;
}
//is in range
var now = DateTime.Now;
long requestTime =0;
if (long.TryParse(time,out requestTime))
{
var max = now.AddMinutes(5).ToString("yyyyMMddHHmmss");
var min = now.AddMinutes(-5).ToString("yyyyMMddHHmmss");
if (!(long.Parse(max) >= requestTime && long.Parse(min) <= requestTime))
{
return false;
}
}
else
{
return false;
}
//hashmac
var sign = Encryption.HmacSHA256(secretKey, signPlain);
return requestSign.Equals(sign, StringComparison.CurrentCultureIgnoreCase);
}
ApiController基類
有了上面這些鋪墊我們就可以在基類完成簽名的驗(yàn)證了。客戶端需要把上面提到的時(shí)間戳,隨機(jī)數(shù),簽名和客戶端的ID放入http請(qǐng)求的headers里面。
我們?cè)诨惖腛nActionExecuting里取出這些數(shù)據(jù)組合成簽名的參數(shù),然后根據(jù)客戶端ID獲取簽名的Key,然后使用同樣的簽名算法計(jì)算簽名。并且比較客戶端的簽名跟服務(wù)端的簽名是否一致。
預(yù)防Replay Attack
預(yù)防重放***主要有兩點(diǎn):
校驗(yàn)時(shí)間戳的范圍
時(shí)間戳跟服務(wù)器時(shí)間相差在一個(gè)合理的范圍內(nèi)視為合法。
緩存簽名
每次請(qǐng)求都去判斷下簽名是否出現(xiàn)過(guò)。如果出現(xiàn)過(guò)則視為非法請(qǐng)求。
因?yàn)橛袝r(shí)間戳跟隨機(jī)數(shù)的存在,所以理論上每次請(qǐng)求的簽名是不可能重復(fù)的。
客戶端調(diào)用
這里演示一下C#簽名并且調(diào)用http接口的代碼
[TestMethod()]
public void GetUserTest()
{
string url = "http://localhost:8090/api/test/GetUser";
string userId = "A39891D4-6CEF-4538-A562-3A422CA9C17A";
string appId = "100001";
string secretKey = "M/vkPOWXgBa7GnRd73t7j+jsKfbZtb+f";
string rumdon = Guid.NewGuid().ToString();
string time = DateTime.Now.ToString("yyyyMMddHHmmss");
//make signture plain text
var sortDict = new SortedDictionary()
{
{"userId",userId }
};
var signPlain = new StringBuilder();
foreach (var keyValue in sortDict)
{
signPlain.AppendFormat("{0}={1}&", keyValue.Key, keyValue.Value);
}
if (signPlain.Length > 1)
{
//remove last &
signPlain.Remove(signPlain.Length - 1, 1);
}
signPlain.Append(time);
signPlain.Append(random);
Console.WriteLine("sign plain:{0}", signPlain.ToString().ToUpper());
//make sign
var sign = Encryption.HmacSHA256(secretKey, signPlain.ToString().ToUpper());
Console.WriteLine("sign:{0}", sign);
string requestUrl = string.Format("{0}?{1}={2}", url, "userId", userId);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);
request.Method = "GET";
//add headers
request.Headers.Add("time", time);
request.Headers.Add("appId", appId);
request.Headers.Add("random", random);
request.Headers.Add("sign", sign);
//
//start request
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
var responseStream = response.GetResponseStream();
if (responseStream != null)
{
using (StreamReader reader = new StreamReader(responseStream))
{
var content = reader.ReadToEnd();
Console.WriteLine(content);
}
}
}
}
catch (WebException ex)
{
using (HttpWebResponse response = (HttpWebResponse)ex.Response)
{
var responseStream = response.GetResponseStream();
if (responseStream != null)
{
using (StreamReader reader = new StreamReader(responseStream))
{
var content = reader.ReadToEnd();
Console.WriteLine(content);
}
}
}
}
}
感謝各位的閱讀,以上就是“ASP.NET MVC OR WebAPI的接口安全怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)ASP.NET MVC OR WebAPI的接口安全怎么實(shí)現(xiàn)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章題目:ASP.NETMVCORWebAPI的接口安全怎么實(shí)現(xiàn)-創(chuàng)新互聯(lián)
URL地址:http://jinyejixie.com/article18/dhopdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、軟件開(kāi)發(fā)、搜索引擎優(yōu)化、域名注冊(cè)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容