最近对接数据的时候涉及到了一些接口数据加密相关的一共试了两种方法, aes和rsa。
采用的方式是双方约定两个key,一个用于参数时效性验证加|解密(采用的是md5,双方约定一个key,根),一个用户接口时效性的加|解密(rsa|aes),如果用aes的密钥双方约定好可以就行了,rsa自行约定公私钥 。
参数格式如下:
token=md5(api_account+time)&api_account=xxxxxx&time=12312415125125¶ms=rsa|aes(XXX),其中MD5所用秘钥为双方约定,如果使用AES则秘钥要需要双方约定。服务根据约定的密钥去验证接口的有效性和解密参数;接口提供方每次去验证参数中的时间是否已失效、md5加密后的字符串token是否与参数以及双方约定的密钥加密的结果一致,通过验证后再去解密参数,然后相应的返回
// RSA加密明文最大长度117字节,加密过程中需要分块进行 function splitDecrypt($encryptData){ $crypto = ''; $privateKey = "-----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE KEY----- "; foreach (str_split(base64_decode($encryptData), 128) as $chunk) { openssl_private_decrypt($chunk, $decryptData, $privateKey); $crypto .= $decryptData; } return $crypto; }
/** * md5 指定秘钥进行加密 * @param $data * @return string */ public static function md5Encrypt($data) { $key = self::MD5_KEY; $ret = mhash(MHASH_MD5, $data, $key); return bin2hex($ret); }
// 解密要求密文最大长度为128字节,解密的过程中需要分块进行 function splitEncrypt($originalData) { $publicKey = "-----BEGIN PUBLIC KEY----- -----END PUBLIC KEY----- "; $cryptResult = ''; foreach (str_split($originalData, 117) as $piece) { openssl_public_encrypt($piece, $encryptData, $publicKey); $cryptResult .= $encryptData; } return base64_encode($cryptResult); }