Java对PHP服务器hmac_sha1签名认证方法的匹配实现
如果你的API服务安全认证协议中要求使用hmac_sha1方法对信息进行编码,
而你的服务是由PHP实现的,客户端是由JAVA实现的,那么为了对签名正确比对,就需要在两者之间建立能匹配的编码方式.
PHP侧如下:
[php] view plaincopy
define('ID','123456');
define('KEY','k123456');
$strToSign = "test_string";
$utf8Str = mb_convert_encoding($strToSign, "UTF-8");
$hmac_sha1_str = base64_encode(hash_hmac("sha1", $utf8Str, KEY));
$signature = urlencode($hmac_sha1_str);
print_r($signature);
JAVA侧需要注意如下几点:
1. hmac_sha1编码结果需要转换成hex格式
2. java中base64的实现和php不一致,其中java并不会在字符串末尾填补=号以把字节数补充为8的整数
3. hmac_sha1并非sha1, hmac_sha1是需要共享密钥的
参考实现如下:
[java] view plaincopy
import java.io.UnsupportedEncodingException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.wicket.util.crypt.Base64UrlSafe;
public class test {
public static void main(String[] args) {
String key = "f85b8b30f73eb2bf5d8063a9224b5e90";
String toHash = "GET"+"\n"+"Thu, 09 Aug 2012 13:33:46 +0000"+"\n"+"/ApiChannel/Report.m";
//String toHashUtf8 = URLEncoder.encode(toHash, "UTF-8");
String res = hmac_sha1(toHash, key);
//System.out.print(res+"\n");
String signature;
try {
signature = new String(Base64UrlSafe.encodeBase64(res.getBytes()),"UTF-8");
signature = appendEqualSign(signature);
System.out.print(signature);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static String hmac_sha1(String value, String key) {
try {
// Get an hmac_sha1 key from the raw key bytes
byte[] keyBytes = key.getBytes();
SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");
// Get an hmac_sha1 Mac instance and initialize with the signing key
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
// Compute the hmac on input data bytes
byte[] rawHmac = mac.doFinal(value.getBytes());
// Convert raw bytes to Hex
String hexBytes = byte2hex(rawHmac);
return hexBytes;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static String byte2hex(final byte[] b){
String hs="";
String stmp="";
for (int n=0; n<b.length; n++){
stmp=(java.lang.Integer.toHexString(b[n] & 0xFF));
if (stmp.length()==1) hs=hs+"0"+stmp;
else hs=hs+stmp;
}
return hs;
}
private static String appendEqualSign(String s){
int len = s.length();
int appendNum = 8 - (int)(len/8);
for (int n=0; n<appendNum; n++){
s += "%3D";
}
return s;
}
}
参考地址: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签名认证方法的匹配实现相关推荐
- Python对PHP服务器hmac_sha1签名认证方法的匹配实现
如果你写的PHP服务端API,在签名中使用了PHP的hash_hmac函数,并且使用了base64编码, 如下: //HMAC-SHA1加密 $hmac_sha1_str = base ...
- Java—通过sign签名认证实现安全的开放接口API
关注微信公众号:CodingTechWork,一起学习进步. 文章目录 引言 API接口 timestamp保证唯一性 shell生成timestamp java生成timestamp模板 sign签 ...
- java 函数签名_Java方法签名和接口
我们知道方法签名只包括方法名称和参数列表,但不包括方法返回类型.那么为什么我为以下代码收到编译器错误,因为java不区分具有相同签名的方法. public class InterfaceTest im ...
- Java API接口签名认证
Java API接口签名认证 我们在进行程序开发的时候,一定会开发一些API接口,供他人访问.当然这些接口中有可能是开放的,也有可能是需要登录才能访问的,也就是需要Token鉴权成功后才可以访问的.那 ...
- java web认证考试_用Java实现Web服务器HTTP协议
一.HTTP协议的作用原理 HTTP协议的作用原理包括四个步骤: 1.连接:Web浏览器与Web服务器建立连接.2.请求:Web浏览器通过socket向Web服务器提交请求.3.应答:Web浏览器提交 ...
- 服务器生成微信sign,签名生成方法
开发者服务端在与微投票服务器交互的过程中,需要对参数进行加签等操作,下边介绍具体规则. 一.服务端 1.请求微投票接口,需要根据参数生成一个签名(sign)并携带在参数中进行请求,最终的请求形式如下: ...
- java如何查看安卓打包签名的md5_Android查看应用签名方法
我们在使用或发布应用到第三方平台时,会要求我们填写应用的相关信息,比如包名.md5值或者sha1值等等.如果是我们自己的应用,获取测试或者正式应用的相关信息都是比较方便的.如果需要第三方应用的相关信息 ...
- 在Apache上隐藏服务器签名的方法
这篇文章主要介绍了在Apache上隐藏服务器签名的方法,示例基于Debian系的Linux,需要的朋友可以参考下 透露网站服务器带有服务器/PHP版本信息的签名会带来安全隐患,因为你基本上将你系统上的 ...
- java xml签名_Java使用DSA密钥对生成XML签名的方法
本文实例讲述了Java使用DSA密钥对生成XML签名的方法.分享给大家供大家参考.具体实现方法如下: MainClass.java代码如下: import java.security.KeyPair; ...
最新文章
- POJ 2718 Smallest Difference 贪心构造
- madplay播放器移植
- juddi MySQL_JUDDI v3部署并连接MySQL数据库
- CorelDRAW中将矩形变圆角的方法
- iOS开发(1)写在前面的话
- Python可视化中Matplotlib绘图(2.设置范围、标签、标题、图例(详细参数))
- VS2010版快捷键
- 怎样解决MySQL数据库主从复制延迟的问题?
- 【转】利用python的KMeans和PCA包实现聚类算法
- Laravel核心解读--Database(四) 模型关联
- myeclipse8.5打包jar并引入第三方jar包
- ArcGIS GP应用-GP模型服务发布
- Spread for Windows Forms高级主题(6)---数据绑定管理
- 智能优化算法:飞蛾扑火优化算法-附代码
- win10+Ubuntu17.10双系统安装(惠普台式机)
- 大数据学习教程之java SE 教程
- java压缩文件解压失败_java安装 解压缩核心文件失败
- C语言系列1——hello world
- 机器学习初探:(十)K均值聚类(K-means)以及KNN算法
- python分析数据走势图_python数据分析-11数据分析实战案例
热门文章
- java生成随机数的两种方式
- python 读取mysql大量数据处理_python使用多线程快速把大量mysql数据导入elasticsearch...
- 计算机专业刚毕业本科生,计算机专业应届本科毕业生自我鉴定
- python中字典的value可以为任意对象_Python学习之字典的删改查操作
- java中数据类型转换、ASCII编码
- Azkaban的介绍、安装与使用
- 前后端分离跨域问题解决方案
- B端产品经理,应从哪些方面理解业务?
- redis主从复制_技术干货分享:一文了解Redis主从复制
- 两个线程同时从服务器接收消息_一文看懂I/O多路复用技术(mysql线程池)