HTTP對外介面,如何增加簽名機制

2021-09-25 16:26:03 字數 1911 閱讀 5020

一、簽名引數sign生成的方法

第1步: 將所有引數(注意是所有引數),除去sign本身,以及值是空的引數,按引數名字母公升序排序。

第2步: 然後把排序後的引數按引數1值1引數2值2…引數n值n(這裡的引數和值必須是傳輸引數的原始值,不能是經過處理的,如不能將"轉成」後再拼接)的方式拼接成乙個字串。

第3步: 把分配給接入方的驗證金鑰key拼接在第2步得到的字串前面。

第2步: 在上一步得到的字串前面加上驗證金鑰key(這裡的金鑰key是介面提供方分配給介面接入方的),然後計算md5值,得到32位字串,然後轉成大寫.

第4步: 計算第3步字串的md5值(32位),然後轉成大寫,得到的字串作為sign的值。

舉例:假設傳輸的資料是實際情況最好是通過post方式傳送),

其中sign引數對應的sign_value就是簽名的值。

第一步,拼接字串,首先去除sign引數本身,然後去除值是空的引數p3,剩下p2=v2&p1=v1&method=cancel&pn=vn,然後按引數名字元公升序排序,method=cancel&p1=v1&p2=v2&pn=vn.

第二步,然後做引數名和值的拼接,最後得到methodcancelp1v1p2v2pnvn

第三步,在上面拼接得到的字串前加上驗證金鑰key,我們假設是abc,得到新的字串abcmethodcancelp1v1p2v2pnvn

第四步,然後將這個字串進行md5計算,假設得到的是abcdef,然後轉為大寫,得到abcdef這個值即為sign簽名值。

注意,計算md5之前請確保介面與接入方的字串編碼一致,如統一使用utf-8編碼或者gbk編碼,如果編碼方式不一致則計算出來的簽名會校驗失敗。

二、簽名驗證方法:

根據前面描述的簽名引數sign生成的方法規則,計算得到引數的簽名值,和引數中通知過來的sign對應的引數值進行對比,如果是一致的,那麼就校驗通過,如果不一致,說明引數被修改過。

以前對安全驗證以及數字認證方面的知識一直覺得諱莫如深,在最近接觸的乙個專案中,涉及到了數字簽名的使用,從一開始我興致勃勃的以為終於可以搞數字認證了,接觸了才發現,原來只是需要數字簽名,並沒有用到數字認證(相對比較麻煩),其實也蠻好理解和開發。

數字簽名的使用,目前接觸到的有兩種方式,1、簽名作為引數;2、全文簽名

在使用http或者soap傳輸資料的時候,簽名作為其中乙個引數,可以起到關鍵作用:1、鑑權(通過客戶的金鑰,服務端的金鑰匹配);2、資料防篡改(引數是明文傳輸,將引數及金鑰加密作為簽名與伺服器匹配);下面來分析下具體的方式:

將請求引數中的各個鍵值對按照key的字串順序公升序排列(大小寫敏感),把key和value拼成一串之後最後加上金鑰,組成key1value1key2value2privatekey的格式,轉成utf-8編碼的位元組序列後計算md5,作為請求的簽名。計算出來的簽名串應當全為小寫形式。如果某個引數的值為空,則此引數不參與簽名。

下面舉個例子。假設引數列表為:

a 123

b 帳號

c 密碼

假設金鑰為:123456

則待簽名的明文為:a123b帳號c密碼123456

將明文按utf-8取位元組序列,並計算md5為:332ce52ed0a9686cc32bdd0eb45de577

客戶端呼叫的例子如: http://host:port/search?a=123&b=帳號&c=密碼&&sign =332ce52ed0a9686cc32bdd0eb45de577

注:因為md5加密是不可逆的,在服務端取到引數後按同樣的規則進行匹配,起到了鑑權及資料完整性的作用。(http協議沒有對傳輸的資料大小進行限制,http協議規範也沒有對url長度進行限制。get方式:特定瀏覽器和伺服器對url長度有限制,例如ie對url長度的限制是2083位元組(2k+35)。因此對於get提交時,傳輸資料就會受到url長度的限制。)

安全的對外介面

我們知道資料在傳輸過程中是很容易被抓包的,如果直接傳輸比如通過http協議,那麼使用者傳輸的資料可以被任何人獲取 所以必須對資料加密,常見的做法對關鍵字段加密比如使用者密碼直接通過md5加密 現在主流的做法是使用https協議,在http和tcp之間新增一層加密層 ssl層 這一層負責資料的加密和解...

示範對外介面引數文件

模組一 1 說明 1 系統間互動引數以json格式進行傳輸 2 加簽驗籤 系統會給接入者提供秘鑰,傳送請求需要根據秘鑰進行加簽,通過後才能進行交易請求 同樣,對於返回的結果系統也會進行加簽,接收方需要用秘鑰進行原交易加簽並進行比較驗證資料的完整性。注 加簽驗籤方法呼叫提供的jar包呼叫相應的方法即可...

加密介面如何測試?

隨著網際網路技術的發展,服務安全性和資料安全性變的越來越重要,提供介面服務的系統往往會應用各種加密技術,保證介面的安全呼叫,如何應用工具來實現加密介面測試成為一項必要技能。在講解如何用jmeter實現介面安全性測試之前,先來了解一下常見的加密演算法,測試同學可根據不同的加密演算法型別和程式猿 程式猿...