這段時間實在太忙了,總有忙不完是事情,博客一直沒有刷新。近日很多朋友問我關於各種接口對數據的安全性控制,今天我們就一起的分享一下”數據簽名驗證“。
我們先來了解一下“數據簽名驗證”的含義:
1.數據
數據是指客戶端傳輸到服務端的數據,說白點就是參數,例如:http://easy98.cn?mobileNO=12345678&SmsContent=test;mobileNO=12345678&SmsContent=test則是傳輸的數據。
2.簽名
簽名是指將數據和密鑰放入一個數據包,通過MD5對此數據包簽名,得到一個MD5的驗證碼,眾所周知MD5是一種不可逆的簽名算法。在驗證碼網絡傳輸中也大可不用考慮它會被解包從而拿到密鑰。
3.驗證
驗證是指在服務端驗證數據包是否被篡改或非法數據,驗證方式:服務端先見數據和密鑰放入數據包,再用MD5簽名得出驗證碼,然后在於客戶端傳過來的驗證碼進行比較,如果一致則代表數據無篡改,反之不是客戶端簽名錯了就是在傳輸時數據被篡改。
廢話少說,大家還是看代碼叫清楚。
1.服務端
public bool SendSms(string authString, string mobiles, string smsContent, ref string error)
{
//簽名的密鑰,服務端和客戶端分別保存一份用於簽名
string md5Key = "980017891ff67cf8a20f23aa810e7b5a";
//簽名驗證
string str = string.Concat(mobiles, smsContent, md5Key);
//計算出MD5值
string md5Value = Helper.ToMD5String(str);
//客戶端簽名結果與服務端簽名結果匹配
if (!md5Value.Equals(authString, StringComparison.CurrentCultureIgnoreCase))
{
//不是合法客戶端請求時,將拒絕對此請求提供服務
error = "非法請求,驗證身份失敗";
return false;
}
//如果是合法請求,則繼續為此請求提供服務
//TODO:以下處理業務....
return true;
}
2.客戶端
public bool Test()
{
//簽名的密鑰,服務端和客戶端分別保存一份用於簽名
string md5Key = "980017891ff67cf8a20f23aa810e7b5a";
string mobiles = "123456789";
string smsContent = "短信內容";
//簽名驗證
string str = string.Concat(mobiles, smsContent, md5Key);
//計算出MD5值
string md5Value = Helper.ToMD5String(str);
string error = string.Empty;
//調用
if (!SendSms(md5Value, mobiles, smsContent, ref error))
{
//調用失敗
}
return true;
}
大家應該對數據簽名驗證了解了,當然在很多情況下還有注意很對細節,和各種場合下的使用。例如有多個客戶端調用此接口,但各個客戶端的密鑰不同,或者我需要拒絕某個客戶端的請求;需要驗證用戶密碼時如何達到不傳輸用戶密碼即可驗證用戶的密碼是否輸入正確...等等。
好了,今天就寫到這,希望大家能提出寶貴意見,互相學習探討。如有疑問請加Q445444818
快來拍磚啦..........