问个HmacSHA1加密的问题

李海华 2014-06-24 01:06:48
有PHP写例子和测试数据,我用java写的加密结果不对,请帮看下,谢谢!

sig签名生成说明
将apikey、appid、secretkey、timestamp使用“&”符号按照下面的示例的顺序连接在一起,请注意连接顺序很重要,并用urlencode进行url进行编码。(注:由于PHP函数http_build_query串联后使用了urlencode进行URL编码)
apikey=YOUR_APIKEY&appid=YOUR_APPID&secretkey=YOUR_SECRETKEY×tamp=1379067425

使用您的秘密密匙用HMAC生成哈希签名。使用sha1作为哈希算法。
### PHP ###
$params = array(
'appid' => $appid,
'apikey' => $apikey,
'secretkey' => $secretkey,
'timestamp' => $timestamp,
);
ksort($params);//对数组键值进行升序排序
$param_uri = http_build_query($params,'','&');
$sig = base64_encode(hash_hmac('sha1', $param_uri, $secretkey));

这是正确的测试数据
$appid = 10000;
$apikey = 'b29de5dc-d92d-de8b-ce32-8292-855s9c9a';
$secretKey = 'TgktZRkt0upf/oYtegyblm4XTUuEFMgCuskOrB29FfQNwSKjGosQeUQtuLU/';
$timestamp = 1402484607;
加密字符串:
apikey=b29de5dc-d92d-de8b-ce32-8292-855s9c9a&appid=10000&secretkey=TgktZRkt0upf%2FoYtegyblm4XTUuEFMgCuskOrB29FfQNwSKjGosQeUQtuLU%2F×tamp=1402484607
加密后:
ZmUyZDA2ZmY2MGRkYTI1NjgxNzI4MjAxN2Y4OTk2YzIxMmE2MTMzOQ==

下面是我用java写的,运行后加串不对,请帮看一下,谢谢
// 测试
String appid = "10000";
String apikey = "b29de5dc-d92d-de8b-ce32-8292-855s9c9a";
String secretkey = "TgktZRkt0upf/oYtegyblm4XTUuEFMgCuskOrB29FfQNwSKjGosQeUQtuLU/";
String time = "1402484607";

String enstr = "apikey="+apikey
+ "&appid="+appid
+ "&secretkey="+encoderStr(secretkey)
+ "×tamp=" + time;

System.out.println("before="+enstr);

String signature = new BASE64Encoder().encode(encodeHmacSHA(enstr.getBytes(),
secretkey.getBytes()));

System.out.println("after="+signature);
...全文
1245 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
中华雪碧 2014-06-24
  • 打赏
  • 举报
回复
php的结果是正确的? 加密字符串,2者确定是一样的吗?
小绵羊 2014-06-24
  • 打赏
  • 举报
回复
/i0G/2DdolaBcoIBf4mWwhKmEzk= 要是我没猜错的话你算出来的值应该是这个
小绵羊 2014-06-24
  • 打赏
  • 举报
回复


String appid = "10000";
		String apikey = "b29de5dc-d92d-de8b-ce32-8292-855s9c9a";
		String secretkey = "TgktZRkt0upf/oYtegyblm4XTUuEFMgCuskOrB29FfQNwSKjGosQeUQtuLU/";
		String timestamp = "1402484607";

		String url = "apikey=" + apikey + "&appid=" + appid + "&secretkey=" + URLEncoder.encode(secretkey, "UTF-8") + "×tamp=" + timestamp;

		SecretKeySpec key = new SecretKeySpec(secretkey.getBytes("UTF-8"), "HmacSHA1");

		Mac mac = Mac.getInstance("HmacSHA1");

		mac.init(key);
		mac.update(url.getBytes("UTF-8"));

		byte[] rawHmac = mac.doFinal();

		StringBuilder builder = new StringBuilder(rawHmac.length);
		for (byte b : rawHmac) {
			int i = b & 0xff;
			if (i <= 0xf) {
				builder.append("0");
			}
			builder.append(Integer.toHexString(i));
		}
		String macStr = builder.toString();//这个结果对应hash_hmac的结果,注意php返回的是hex字符串
		
		
		//php base64_encode的参数是个字符串,java的是个byte[],你的错误就出在这里,不能直接把mac数组进行编码,要先转成hexstr后再进行编码
		System.out.println(new BASE64Encoder().encode(macStr.getBytes("UTF-8")));
李海华 2014-06-24
  • 打赏
  • 举报
回复
我是用java写的,你能在本地运行一下吗?
  • 打赏
  • 举报
回复
不是加,是去掉最后一个逗号。
李海华 2014-06-24
  • 打赏
  • 举报
回复
在线等,十分着急
李海华 2014-06-24
  • 打赏
  • 举报
回复
加了也不对,方便在你本地调下吗?
  • 打赏
  • 举报
回复
$params = array( 'appid' => $appid, 'apikey' => $apikey, 'secretkey' => $secretkey, 'timestamp' => $timestamp, ); 你这个最后其实应该是多一个逗号,会默认添加一个&符号吧。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧