• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

认证加密算法php hash_hmac和java hmacSha1的问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
public class Test{
	

	public static void main(String[] args) throws Exception {
                String postString = "abc";
                String signature = ByteToHex(genHMAC(postString, "310A54B3C9C12920E1582E016F15DD441ACE8553769E8991")).toUpperCase();        
	}
	
	/** 
     * 使用 HMAC-SHA1 签名方法对data进行签名 
     *  
     * @param data 
     *            被签名的字符串 
     * @param key 
     *            密钥      
     * @return  
                      加密后的字符串 
     */  
    public static byte[] genHMAC(String data, String key) {  
        byte[] result = null;  
        try {  
            //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称    
            SecretKeySpec signinKey = new SecretKeySpec(hexString2Bytes(key), "HmacSHA1");  
            //生成一个指定 Mac 算法 的 Mac 对象    
            Mac mac = Mac.getInstance("HmacSHA1");  
            //用给定密钥初始化 Mac 对象    
            mac.init(signinKey);  
            //完成 Mac 操作     
            byte[] rawHmac = mac.doFinal(data.getBytes());  
            result = rawHmac;  
  
        } catch (NoSuchAlgorithmException e) {  
            System.err.println(e.getMessage());  
        } catch (InvalidKeyException e) {  
            System.err.println(e.getMessage());  
        }  
        if (null != result) {  
            return result;  
        } else {  
            return null;  
        }  
    }
	
	public static byte[] hexString2Bytes(String src) {  
        int l = src.length() / 2;  
        byte[] ret = new byte[l];  
        for (int i = 0; i < l; i++) {  
            ret[i] = (byte) Integer  
                    .valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();  
        }  
        return ret;  
    } 

	// btye转换hex函数
    public static String ByteToHex(byte[] byteArray) {
        StringBuffer StrBuff = new StringBuffer();
        for (int i = 0; i < byteArray.length; i++) {
            if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {
                StrBuff.append("0").append(
                        Integer.toHexString(0xFF & byteArray[i]));
            } else {
                StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
            }
        }
        return StrBuff.toString();
    }

}    

 

方法一:

$str = "abc";
$key = "310A54B3C9C12920E1582E016F15DD441ACE8553769E8991";
$decodedKey = pack("H*", $key);  //十六进制转成字符串
$hash = bin2hex(hash_hmac("sha1", $str, $decodedKey, true));

  

方法二:

//字节数组转化为String类型的数据
function toStr($bytes) {
    $str = '';
    foreach($bytes as $ch) {
        $str .= chr($ch);
    }
    return $str;
}
//字符串转十六进制
function String2Hex($string){
    $hex='';
    for ($i=0; $i < strlen($string); $i++){
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}

//十六进制转字符串
function Hex2String($hex){
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2){
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}

$str = "abc";
$key = "310A54B3C9C12920E1582E016F15DD441ACE8553769E8991";
$decodedKey = pack("H*", $key);  //十六进制转字符串
$hash = hash_hmac("sha1", $str, $decodedKey, true);
//字符串转字节数组,即ascii数组 $hashs = str_split($hash); foreach ($hashs as $index => $value) { if (ord($value) > 128) { $hashs[$index] = ord($value) - 128 * 2; } else { $hashs[$index] = ord($value); } } $signature = String2Hex(toStr($hashs)); echo $signature;

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
PHP的代理模式发布时间:2022-07-10
下一篇:
[namespace]PHP命名空间的使用基础发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap