必須知道MD5是不可逆性
在講解MD5簽名原理之前,必須明白MD5是不可逆的,也就是不可破解的,當(dāng)然可能稍有了解的人會(huì)說MD5可以破解,當(dāng)然,網(wǎng)上也有一些強(qiáng)大的數(shù)據(jù)庫會(huì)把各種數(shù)據(jù)組合的MD5收集起來形成強(qiáng)大的數(shù)據(jù)庫,能冠軍數(shù)據(jù)庫搜索可能一些簡單的數(shù)據(jù)會(huì)馬上找出某些組合對應(yīng)的MD5值,但咱說的MD5簽名生成是最少32位的數(shù)值MD5加密,所以這個(gè)破解的可能性是非常非常非常小的。所以這還是比較安全的。
原理
原理很簡單,請求方對請求數(shù)據(jù)按一定的規(guī)則排序,加上appkey碼一起通過MD5加密生成簽名,然后把請求數(shù)據(jù)和簽名發(fā)給服務(wù)方,服務(wù)方拿到數(shù)據(jù)后,去掉appid和無用的數(shù)據(jù),通過appid找到請求方的appkey,然后按同樣的規(guī)則處理數(shù)據(jù),并加上appkey通過MD5加密也生成簽名,然后和請求方生成的簽名去對比,如果值一樣,簽名驗(yàn)證通過。
需要的東西
服務(wù)商一般會(huì)給你一個(gè)appid,appkey;同時(shí)這兩個(gè)參數(shù)服務(wù)商也會(huì)保存,這兩個(gè)形成了你的唯一標(biāo)識(shí)。
appid通過網(wǎng)絡(luò)傳輸,而appkey是不在網(wǎng)絡(luò)上進(jìn)行傳輸?shù)?,只在生成簽名時(shí)使用,所以安全性還是比較高的。
MD5生成簽名的流程
1. 除去加密數(shù)組中的空值和簽名參數(shù)
2. 對數(shù)組排序
3. 把數(shù)組所有元素,按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串
4. 加上appkey值,對形成的數(shù)據(jù)進(jìn)行MD5加密,生成簽名
下面是各步聚的PHP代碼
1. 除去加密數(shù)組中的空值和簽名參數(shù)
2. 對數(shù)組排序
3.把數(shù)組所有元素,按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串
4.加上appkey值,對形成的數(shù)據(jù)進(jìn)行MD5加密,生成簽名
看實(shí)例更清晰
比如我要拿下面數(shù)據(jù)去服務(wù)方接口請求:
-
第一步會(huì)把請求數(shù)組中的空值,或者沒必要的參數(shù)都去掉,得到了下面的數(shù)據(jù),這才是真正的需要的靈數(shù)據(jù)。
最詳細(xì)的MD5簽名的原理和流程 -
然后對數(shù)組進(jìn)行排序,得到下面的結(jié)果。
最詳細(xì)的MD5簽名的原理和流程 -
然后對數(shù)組進(jìn)行拼接,得到下在結(jié)果
最詳細(xì)的MD5簽名的原理和流程 -
然后加上appkey生成最終的簽名。
最詳細(xì)的MD5簽名的原理和流程 -
最后在原始數(shù)據(jù)后面加上生成的簽名,就是最終要傳給用戶的數(shù)據(jù),紅圈里的是最后加上的簽名。
最詳細(xì)的MD5簽名的原理和流程 - 客戶收到數(shù)據(jù)后會(huì)拿數(shù)據(jù)去按上面方法處理,最后把生成的簽名值,和你的$data['sign']進(jìn)行比較,如果值一樣,簽名通過。