公共傳遞參數json
參數名後端 |
類型服務器 |
必選app |
描述函數 |
app_id | string | 是 | 調用方身份ID,接口提供方用此來識別調不一樣的調用者,該參數是API基本規範的一部分,請詳見API公共規範。 |
sign_type | string | 是 | 簽名類型:MD5,RSA2 |
sign編碼 |
string排序 |
是 token |
一次接口調用的簽名值,服務器端 「防止 假裝請求/防篡改/ 防重發」 識別的重要依據。接口 |
timestamp字符串 |
Int |
是 |
時間戳(long Timestamp = DateTime.Now.Ticks;)
|
method | string | 是 | /user/info.json |
1.篩選並排序
獲取全部請求參數,不包括字節類型參數,如文件、字節流,剔除sign字段,剔除值爲空的參數,並按照第一個字符的鍵值ASCII碼遞增排序(字母升序排序),若是遇到相同字符則按照第二個字符的鍵值ASCII碼遞增排序,以此類推。
2.拼接
將排序後的參數與其對應值,組合成「參數=參數值」的格式,而且把這些參數用&字符鏈接起來,此時生成的字符串爲待簽名字符串。
3.調用簽名函數
使用各自語言對應的SHA256WithRSA(對應sign_type爲RSA2)或SHA1WithRSA(對應sign_type爲RSA)簽名函數利用商戶私鑰對待簽名字符串進行簽名,並進行Base64編碼。
4.把生成的簽名賦值給sign參數,拼接到請求參數中。
後端代碼能夠增長一個時間戳的時效性判斷,好比時間戳必須是當前時間的先後半小時內(可與token的過期機制一致,若是涉及到資金,可能還要縮短期限制,而且在業務上還要作調整,好比轉帳,先生成一個轉帳訂單,而後再發起一個轉帳請求,判斷是否已轉帳,這樣能夠防止重複提交攻擊,若是是app,還能夠增長登陸會話中提交有效),這樣能夠防止重複提交攻擊。
每次請求目標接口前,先使用簽名的方法,獲取一個驗證碼(基於會話,這個驗證碼在服務端的會話中,是一個指定的變量,同一會話,都是從這個變量中取),而後把這個驗證碼加入到目標接口參數中;由於驗證碼用事後就會換一個,目標接口請求完後,驗證碼失效,請求失敗,可防止重複提交攻擊。