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