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条评论