如果你的API服务安全认证协议中要求使用hmac_sha1方法对信息进行编码,

而你的服务是由PHP实现的,客户端是由JAVA实现的,那么为了对签名正确比对,就需要在两者之间建立能匹配的编码方式.

PHP侧如下:

[php] view plaincopy

  1. define('ID','123456');

  2. define('KEY','k123456');

  3. $strToSign = "test_string";

  4. $utf8Str = mb_convert_encoding($strToSign, "UTF-8");

  5. $hmac_sha1_str = base64_encode(hash_hmac("sha1", $utf8Str, KEY));

  6. $signature = urlencode($hmac_sha1_str);

  7. print_r($signature);

JAVA侧需要注意如下几点:

1. hmac_sha1编码结果需要转换成hex格式

2. java中base64的实现和php不一致,其中java并不会在字符串末尾填补=号以把字节数补充为8的整数

3. hmac_sha1并非sha1, hmac_sha1是需要共享密钥的

参考实现如下:

[java] view plaincopy

  1. import java.io.UnsupportedEncodingException;

  2. import javax.crypto.Mac;

  3. import javax.crypto.spec.SecretKeySpec;

  4. import org.apache.wicket.util.crypt.Base64UrlSafe;

  5. public class test {

  6. public static void main(String[] args) {

  7. String key = "f85b8b30f73eb2bf5d8063a9224b5e90";

  8. String toHash =  "GET"+"\n"+"Thu, 09 Aug 2012 13:33:46 +0000"+"\n"+"/ApiChannel/Report.m";

  9. //String toHashUtf8 = URLEncoder.encode(toHash, "UTF-8");

  10. String res = hmac_sha1(toHash, key);

  11. //System.out.print(res+"\n");

  12. String signature;

  13. try {

  14. signature = new String(Base64UrlSafe.encodeBase64(res.getBytes()),"UTF-8");

  15. signature = appendEqualSign(signature);

  16. System.out.print(signature);

  17. } catch (UnsupportedEncodingException e) {

  18. e.printStackTrace();

  19. }

  20. }

  21. public static String hmac_sha1(String value, String key) {

  22. try {

  23. // Get an hmac_sha1 key from the raw key bytes

  24. byte[] keyBytes = key.getBytes();

  25. SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");

  26. // Get an hmac_sha1 Mac instance and initialize with the signing key

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

  28. mac.init(signingKey);

  29. // Compute the hmac on input data bytes

  30. byte[] rawHmac = mac.doFinal(value.getBytes());

  31. // Convert raw bytes to Hex

  32. String hexBytes = byte2hex(rawHmac);

  33. return hexBytes;

  34. } catch (Exception e) {

  35. throw new RuntimeException(e);

  36. }

  37. }

  38. private static String byte2hex(final byte[] b){

  39. String hs="";

  40. String stmp="";

  41. for (int n=0; n<b.length; n++){

  42. stmp=(java.lang.Integer.toHexString(b[n] & 0xFF));

  43. if (stmp.length()==1) hs=hs+"0"+stmp;

  44. else hs=hs+stmp;

  45. }

  46. return hs;

  47. }

  48. private static String appendEqualSign(String s){

  49. int len = s.length();

  50. int appendNum = 8 - (int)(len/8);

  51. for (int n=0; n<appendNum; n++){

  52. s += "%3D";

  53. }

  54. return s;

  55. }

  56. }

参考地址:http://blog.csdn.net/iefreer/article/details/7864190

ios开发参考地址:http://blog.woodbunny.com/post-86.html

http://www.lidaren.com/archives/724

转载于:https://blog.51cto.com/4789781/1436699

Java对PHP服务器hmac_sha1签名认证方法的匹配实现相关推荐

  1. Python对PHP服务器hmac_sha1签名认证方法的匹配实现

    如果你写的PHP服务端API,在签名中使用了PHP的hash_hmac函数,并且使用了base64编码, 如下: //HMAC-SHA1加密         $hmac_sha1_str = base ...

  2. Java—通过sign签名认证实现安全的开放接口API

    关注微信公众号:CodingTechWork,一起学习进步. 文章目录 引言 API接口 timestamp保证唯一性 shell生成timestamp java生成timestamp模板 sign签 ...

  3. java 函数签名_Java方法签名和接口

    我们知道方法签名只包括方法名称和参数列表,但不包括方法返回类型.那么为什么我为以下代码收到编译器错误,因为java不区分具有相同签名的方法. public class InterfaceTest im ...

  4. Java API接口签名认证

    Java API接口签名认证 我们在进行程序开发的时候,一定会开发一些API接口,供他人访问.当然这些接口中有可能是开放的,也有可能是需要登录才能访问的,也就是需要Token鉴权成功后才可以访问的.那 ...

  5. java web认证考试_用Java实现Web服务器HTTP协议

    一.HTTP协议的作用原理 HTTP协议的作用原理包括四个步骤: 1.连接:Web浏览器与Web服务器建立连接.2.请求:Web浏览器通过socket向Web服务器提交请求.3.应答:Web浏览器提交 ...

  6. 服务器生成微信sign,签名生成方法

    开发者服务端在与微投票服务器交互的过程中,需要对参数进行加签等操作,下边介绍具体规则. 一.服务端 1.请求微投票接口,需要根据参数生成一个签名(sign)并携带在参数中进行请求,最终的请求形式如下: ...

  7. java如何查看安卓打包签名的md5_Android查看应用签名方法

    我们在使用或发布应用到第三方平台时,会要求我们填写应用的相关信息,比如包名.md5值或者sha1值等等.如果是我们自己的应用,获取测试或者正式应用的相关信息都是比较方便的.如果需要第三方应用的相关信息 ...

  8. 在Apache上隐藏服务器签名的方法

    这篇文章主要介绍了在Apache上隐藏服务器签名的方法,示例基于Debian系的Linux,需要的朋友可以参考下 透露网站服务器带有服务器/PHP版本信息的签名会带来安全隐患,因为你基本上将你系统上的 ...

  9. java xml签名_Java使用DSA密钥对生成XML签名的方法

    本文实例讲述了Java使用DSA密钥对生成XML签名的方法.分享给大家供大家参考.具体实现方法如下: MainClass.java代码如下: import java.security.KeyPair; ...

最新文章

  1. POJ 2718 Smallest Difference 贪心构造
  2. madplay播放器移植
  3. juddi MySQL_JUDDI v3部署并连接MySQL数据库
  4. CorelDRAW中将矩形变圆角的方法
  5. iOS开发(1)写在前面的话
  6. Python可视化中Matplotlib绘图(2.设置范围、标签、标题、图例(详细参数))
  7. VS2010版快捷键
  8. 怎样解决MySQL数据库主从复制延迟的问题?
  9. 【转】利用python的KMeans和PCA包实现聚类算法
  10. Laravel核心解读--Database(四) 模型关联
  11. myeclipse8.5打包jar并引入第三方jar包
  12. ArcGIS GP应用-GP模型服务发布
  13. Spread for Windows Forms高级主题(6)---数据绑定管理
  14. 智能优化算法:飞蛾扑火优化算法-附代码
  15. win10+Ubuntu17.10双系统安装(惠普台式机)
  16. 大数据学习教程之java SE 教程
  17. java压缩文件解压失败_java安装 解压缩核心文件失败
  18. C语言系列1——hello world
  19. 机器学习初探:(十)K均值聚类(K-means)以及KNN算法
  20. python分析数据走势图_python数据分析-11数据分析实战案例

热门文章

  1. java生成随机数的两种方式
  2. python 读取mysql大量数据处理_python使用多线程快速把大量mysql数据导入elasticsearch...
  3. 计算机专业刚毕业本科生,计算机专业应届本科毕业生自我鉴定
  4. python中字典的value可以为任意对象_Python学习之字典的删改查操作
  5. java中数据类型转换、ASCII编码
  6. Azkaban的介绍、安装与使用
  7. 前后端分离跨域问题解决方案
  8. B端产品经理,应从哪些方面理解业务?
  9. redis主从复制_技术干货分享:一文了解Redis主从复制
  10. 两个线程同时从服务器接收消息_一文看懂I/O多路复用技术(mysql线程池)