PHP
JAVA版HmacSHA256加密转PHP版
JAVA版HmacSHA256加密转PHP版
最近在对接银行接口,对方给过来的demo是JAVA版的,其中涉及到加密部分,用到HmacSHA256加密,需要转成PHP代码,所以在这里跟大家分享一下,下面是JAVA代码:
/** * HmacSHA256加密 * 请确保key值顺序排列 * @param value * 需要加密的字符串 * @param secret * HmacSHA256 key * @return */ public static String sign(String value,String secret) { try { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256"); sha256_HMAC.init(secret_key); String hash =new String(UrlBase64.encode(sha256_HMAC.doFinal(value.getBytes("utf-8")))); return hash; } catch (Exception e) { System.out.println("Failed to generate the sign."+ e); return null; } }
由于PHP并没有URL安全编码到函数,所以需要自己参照JAVA的demo自己写一个,下面贴出代码:
/** * 获取sign(HmacSHA256验签) * @param array $post * @param string $secret * @return string */ function getApiSign($post = array(), $secret = "") { //通过键进行排序 a,b,c ksort($post); //初始化参数 $str = ''; //循环拼接参数 foreach ($post as $key => $value) { //拼接参数 $str .= $key . "=" . urlencode($value) . "&"; } //去除最后一个字符 $str = substr($str, 0, strlen($str) - 1); //字符串转大写 $str = strtoupper($str); //HMAC-SHA256加密 $sign = hash_hmac('sha256', $str, $secret, true); //参数编码 $sign = base64UrlEncode($sign); //返回 return $sign; } /** * URL安全的字符串编码 * @param $str * @return string */ function base64UrlEncode($str) { $data = base64_encode($str); $data = str_replace(array('+', '/', '='), array('-', '_', '.'), $data); return $data; }
这样就成功将JAVA版HmacSHA256加密转成PHP版。
0条评论