摘要:最近公司有個業(yè)務(wù),需要對接第三方接口,但是參數(shù)是需要加密的,對方也只提供了一個的,在網(wǎng)上到處搜索,沒有找到直接就能用的方法,后來還是跟公司的工程師對接出來的,在這里記錄一下大致的流程。
最近公司有個業(yè)務(wù),需要對接第三方接口,但是參數(shù)是需要加密的,對方也只提供了一個java的demo,在網(wǎng)上到處搜索,沒有找到直接就能用的方法,后來還是跟公司的Android工程師對接出來的,在這里記錄一下大致的流程。
首先說明一下對方要求的接口請求方式,格式為:http://ip:port/interface/method?data=摘要@@16進制字符串
說明:
1. 請求參數(shù)需要組合成a=1&b=2&c=3格式的參數(shù)串; 2. 摘要的生成方法為md5("a=1&b=2&c=3"); 3. 16進制字符串的生成方法是將參數(shù)串進行**對稱加密(DES-ECB)**后再轉(zhuǎn)成16進制字符串(bin2hex函數(shù));
對方提供的demo(java版本)如下:
public class DesUtils { /** 默認密鑰 */ private static String strDefaultKey = "seeyonssokey"; /** 加密工具 */ private Cipher encryptCipher; /** 解密工具 */ private Cipher decryptCipher; /** * 加密字符串 * @param strIn 需加密的字符串 * @return 加密后的字符串 * @throws Exception */ public String encrypt(String strIn) throws Exception { return byteArr2HexStr(encryptCipher.doFinal(strIn.getBytes())); } /** * 解密字符串 * @param strIn 需解密的字符串 * @return 解密后的字符串 * @throws Exception */ public String decrypt(String strIn) throws Exception { return new String(decryptCipher.doFinal(hexStr2ByteArr(strIn))); } /** * 將 byte 數(shù)組轉(zhuǎn)換為表示 16 進制值的字符串, 如: byte[]{8,18} 轉(zhuǎn)換為: 0813 , 和 public static * byte[] hexStr2ByteArr(String strIn) 互為可逆的轉(zhuǎn)換過程 * @param arrB 需要轉(zhuǎn)換的 byte 數(shù)組 * @return 轉(zhuǎn)換后的字符串 * @throws Exception 本方法不處理任何異常,所有異常全部拋出 */ public static String byteArr2HexStr(byte[] arrB) throws Exception { int iLen = arrB.length; // 每個byte用兩個字符才能表示,所以字符串的長度是數(shù)組長度的兩倍 StringBuffer sb = new StringBuffer(iLen * 2); for(int i = 0; i < iLen; i++) { int intTmp = arrB[i]; // 把負數(shù)轉(zhuǎn)換為正數(shù) while(intTmp < 0) { intTmp = intTmp + 256; } // 小于0F的數(shù)需要在前面補0 if(intTmp < 16) { sb.append("0"); } sb.append(Integer.toString(intTmp, 16)); } return sb.toString(); } /** * 將 表 示 16 進 制 值 的 字 符 串 轉(zhuǎn) 換 為 byte 數(shù) 組 , 和 public static String * byteArr2HexStr(byte[] arrB) 互為可逆的轉(zhuǎn)換過程 * @param strIn 需要轉(zhuǎn)換的字符串 * @return 轉(zhuǎn)換后的 byte 數(shù)組 * @throws Exception 本方法不處理任何異常,所有異常全部拋出 * @author LiGuoQing */ public static byte[] hexStr2ByteArr(String strIn) throws Exception { byte[] arrB = strIn.getBytes(); int iLen = arrB.length; // 兩個字符表示一個字節(jié),所以字節(jié)數(shù)組長度是字符串長度除以2 byte[] arrOut = new byte[iLen / 2]; for(int i = 0; i < iLen; i = i + 2) { String strTmp = new String(arrB, i, 2); arrOut[i / 2] = (byte)Integer.parseInt(strTmp, 16); } return arrOut; } /** * 從指定字符串生成密鑰,密鑰所需的字節(jié)數(shù)組長度為 8 位 不足 8 位時后面補 0 , 超出 8 位只取前 8 位 * @param arrBTmp 構(gòu)成該字符串的字節(jié)數(shù)組 * @return 生成的密鑰 * @throws java.lang.Exception */ private static Key getKey(byte[] arrBTmp) throws Exception { // 創(chuàng)建一個空的8位字節(jié)數(shù)組(默認值為0) byte[] arrB = new byte[8]; // 將原始字節(jié)數(shù)組轉(zhuǎn)換為8位 for(int i = 0; i < arrBTmp.length && i < arrB.length; i++) { arrB[i] = arrBTmp[i]; } // 生成密鑰 Key key = new SecretKeySpec(arrB, "DES"); return key; } public static String encrypt(String strIn, String secretkey) throws Exception { Key key = getKey(secretkey.getBytes("utf-8")); Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.ENCRYPT_MODE, key); return byteArr2HexStr(cipher.doFinal(strIn.getBytes("utf-8"))); } public static String decrypt(String strIn, String secretkey) throws Exception { Key key = getKey(secretkey.getBytes("utf-8")); Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.DECRYPT_MODE, key); byte[] param = cipher.doFinal(hexStr2ByteArr(strIn)); return new String(param, "utf-8"); } }
PHP實現(xiàn)加密功能的的方法有兩種:
mcrypt方式(適用于php7.0以前的版本):
輸出為:990389f0aad8d12014ca6a45cd72cdf7
openssl方式(適用于php7.0以后的版本):
輸出為:990389f0aad8d12014ca6a45cd72cdf7
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71989.html
摘要:最近公司有個業(yè)務(wù),需要對接第三方接口,但是參數(shù)是需要加密的,對方也只提供了一個的,在網(wǎng)上到處搜索,沒有找到直接就能用的方法,后來還是跟公司的工程師對接出來的,在這里記錄一下大致的流程。 最近公司有個業(yè)務(wù),需要對接第三方接口,但是參數(shù)是需要加密的,對方也只提供了一個java的demo,在網(wǎng)上到處搜索,沒有找到直接就能用的方法,后來還是跟公司的Android工程師對接出來的,在這里記錄一下...
摘要:密鑰長度是位,超過位數(shù)密鑰被忽略。跨語言做加密解密經(jīng)常會出現(xiàn)問題,往往是填充方式不對編碼不一致或者加密解密模式?jīng)]有對應(yīng)上造成。是為了兼容用加密的結(jié)果。 最近在對接客戶的CRM系統(tǒng),獲取令牌時,要用DES方式加密解密,由于之前沒有搞錯這種加密方式,經(jīng)過請教了百度和谷歌兩個老師后,結(jié)合了多篇文檔內(nèi)容后,終于實現(xiàn)了。 一、DES介紹 DES 是對稱性加密里面常見一種,全稱為 Data Enc...
摘要:非對稱加密與對稱加密相對的是非對稱加密,非對稱加密的核心思想是使用一對相對的密匙,分為公匙和私匙,私匙自己安全保存,而將公匙公開。 引言 互聯(lián)網(wǎng)的發(fā)展史上,安全性一直是開發(fā)者們相當重視的一個主題,為了實現(xiàn)數(shù)據(jù)傳輸安全,我們需要保證:數(shù)據(jù)來源(非偽造請求)、數(shù)據(jù)完整性(沒有被人修改過)、數(shù)據(jù)私密性(密文,無法直接讀取)等。雖然現(xiàn)在已經(jīng)有SSL/TLS協(xié)議實現(xiàn)的HTTPS協(xié)議,但是因在客戶...
摘要:今天在對接一個第三方接口的時候,對方需要模式下的加密。這里簡單寫一個獲取庫存,更新價格信息加密結(jié)果解密結(jié)果加密數(shù)據(jù)解密數(shù)據(jù)執(zhí)行方法加密結(jié)果解密結(jié)果 今天在對接一個第三方接口的時候,對方需要AES CBC模式下的加密。這里簡單寫一個demo class Model_Junjingbao extends Model { private static $_partnerKey...
摘要:現(xiàn)在的提供了一種更易于使用和維護的計劃任務(wù)方式。注意事項建議開啟這樣會極大的加速類的加載。 lumen 為速度而生的 Laravel 框架 官網(wǎng)的介紹很簡潔,而且 lumen 確實也很簡單,我在調(diào)研了 lumen 相關(guān)組件(比如緩存,隊列,校驗,路由,中間件和最重要的容器)之后認為已經(jīng)能夠滿足我目前這個微服務(wù)的需求了。 任務(wù)目標 showImg(https://segmentfault...
閱讀 3633·2021-11-22 09:34
閱讀 3201·2021-11-15 11:38
閱讀 3083·2021-10-27 14:16
閱讀 1266·2021-10-18 13:35
閱讀 2440·2021-09-30 09:48
閱讀 3441·2021-09-29 09:34
閱讀 1669·2019-08-30 15:54
閱讀 1832·2019-08-26 11:57