API合作商Key 生成秘鑰KEY
秘鑰是用來完成加密,解密的
API合作商KEY(生成秘鑰): DesKey
對稱加密:加解密是同一個密鑰,速度快,數據接收方需要公布其私鑰給數據傳輸方,安全性完全依賴於該密鑰。如AES,3DES,DES等,適合做大量數據或數據文件的加解密。
非對稱加密:加密用公鑰,解密用私鑰。公鑰和私鑰是成對的(可借助工具生成,如openssl等),即用公鑰加密的數據,一定能用其對應的私鑰解密,能用私鑰解密的數據,一定是其對應的公鑰加密。對大量數據或數據文件加解密時,效率較低。如RSA,Rabin等,數據接收方需公布其公鑰給數據傳輸方,私鑰自己保留,安全性更高。
API合作商簽名(加密參數) : Md5Key
參考: https://blog.csdn.net/hi_robert/article/details/74294495
數字簽名
作用:保證信息傳輸的完整性、發送者的身份驗證、防止交易中的抵賴發生。
數字簽名是為了做一個客戶合法性和數據完整性的校驗,防止流氓軟件對數據傳輸進行攔截,對數據篡改后再傳輸。一般是通過hash函數計算出一個固定長度的哈希串(如md5,一般是根據授權的用戶信息和選取數據體報文的摘要作為計算規則),加密后與數據體密文一起傳輸給接收方,接收方在對數據解密后,以相同的規則進行hash串的計算,如果兩者一樣,則證明該次請求是合法的。
關鍵字: 接口驗證 秘鑰
請求方,接口提供方
- 請求參數是否被篡改
- 請求來源是否合法
- 請求是否具有唯一性
A. 參數簽名方式
參考: https://www.jianshu.com/p/d47da77b6419
在編程中:一個冪等操作的特點是: 其任意多次執行所產生的影響均與一次執行的影響相同。
AES 是一種對稱加密算法
plaintext 明文 , chipertext 密文
接口認證簽名、加密、解密
請求參數的鍵按自然的順序排序
app_key 應用鍵 (唯一)
app_secret 應用秘鑰(唯一)
- _t 請求的時間,在一分鍾之內合法,超過不合法
客服端與服務端時間得統一,請求且響應的參數值也得
用戶登錄憑證 token
應用憑證: app_token
code ===0 成功,其它失敗
msg
data
access_token 生成實例
應用ID
應用key
providerid 1000000010
privatekey 0B1FC078-A244-4FAD-BECC-6255DDDE5236
四.接口參數key的生成規則
1.接口參數key的生成規則如下:
調用接口所需要的key定義為key=md5(“userid={1}&providerid={2}&privatekey={3}”)
其中{1}為要查詢或操作的id號,一般為接口的第一個參數,如接口UserLogin為用戶編號userid, {2}為長寬分配給調用方的id, {3}為長寬分配給調用方的key,id及key值參見附錄1.
2.測試案例:
key=md5(“010010000101&providerid=1000000010&privatekey=0B1FC078-A244-4FAD-BECC-6255DDDE5236”)
key=“68ABC26E8C5FE2F7A18C511522C93AF9”
還可以加隨機字符串來加鹽
https://www.cnblogs.com/xiaochangwei/p/api.html
無狀態: 請求需要參數驗證,響應也是需要參數驗證的吧,得確定參數沒有被修改
對請求的合法性進行校驗
對請求的數據進行校驗
signature 簽名,署名,信號
timestamp 60s以內有效
_t
private_key 秘鑰
請求和響應都需要加一個簽名參數
微信jsAPI:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2
設所有發送或者接收到的數據為集合M,將集合M內非空參數值的參數按照參數名ASCII碼從小到大排序(字典序),使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特別注意以下重要規則:
◆ 參數名ASCII碼從小到大排序(字典序);
◆ 如果參數的值為空不參與簽名;
◆ 參數名區分大小寫;
◆ 驗證調用返回或微信主動通知簽名時,傳送的sign參數不參與簽名,將生成的簽名與該sign值作校驗。
◆ 微信接口可能增加字段,驗證簽名時必須支持增加的擴展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,並對stringSignTemp進行MD5運算,再將得到的字符串所有字符轉換為大寫,得到sign值signValue。
騰訊雲: https://cloud.tencent.com/document/api/213/6984
SecretId:用於標識 API 調用者身份;
SecretKey:用於加密簽名字符串和服務器端驗證簽名字符串的密鑰。
HmacSHA1
$secretKey = 'Gu5t9xGARNpq86cd98joQYCN3Cozk1qA';
$srcStr = 'GETcvm.api.qcloud.com/v2/index.php?Action=DescribeInstances&InstanceIds.0=ins-09dx96dg&Nonce=11886&Region=ap-guangzhou&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA&SignatureMethod=HmacSHA1&Timestamp=1465185768';
$signStr = base64_encode(hash_hmac('sha1', $srcStr, $secretKey, true));
echo $signStr;
隨機數,為了保證簽名不可預測
微信支付API接口協議中包含字段nonce_str,主要保證簽名不可預測。我們推薦生成隨機數算法如下:調用隨機數函數生成,將得到的值轉換為字符串。
值為null,簽名參數不參與簽名計算
參數值 ===null 不參與簽名,為什么了?
響應data參數也不參與簽名
共享錢包:
MD5(agentName+API key + 隨機字符串) 代理名稱+私鑰+隨機字符串
最好加上時間戳吧
簽名算法
sha1withrsa sha256withrsa
RSA2是在原來SHA1WithRSA簽名算法的基礎上,新增了支持SHA256WithRSA的簽名算法
RSA2 OPENSSL_ALGO_SHA256
RSA OPENSSL_ALGO_SHA1
https://blog.csdn.net/u014377963/article/details/71775171
if("RSA2"==$this->sign_type){
openssl_sign($data, $signature, $private_id, OPENSSL_ALGO_SHA256 );
}else{
openssl_sign($data, $signature, $private_id, OPENSSL_ALGO_SHA1 );
}