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

发表评论