目录

前言

签名认证

签名认证步骤:

下面以java代码举例:

DEMO


前言

当前时代,数据是王 道!当我们自己的平台有了足够大的数据量,就有可能诞生一个开放平台供第三方分析、使用。那么我们怎么去实现对外部调用接口的控制与鉴权呢?这是我们今天的重点——接口签名认证!!!

签名认证

开放平台会为每一位注册用户分配一个对应账户API KEY和秘钥API SECRET。我们为了保证接口的安全性,用户在每次接口的调用都需要上传一个所谓的签名(基于API KEYAPI SECRET获取)

签名认证步骤:

  1. 首先生成一个Unix时间戳timestamp,时间精确到毫秒【即1970年1月1日(UTC/GMT的午夜)开始所经过的毫秒数】;
  2. 生成随机数nonce(注:目前定义的是32位的,可以通过随机数工具类生成) ;
  3. 1)将timestamp、nonce、API_KEY 这三个字符串依据“字符串首位字符的ASCII码”进行升序排列(排序过程中若出现ASCII码值相同的情况,则依次递增对下一位进行比较)(这种排序,”也就是俗称的字典序“),并将排序后的结果拼接成为一个字符串join_str;
    2)接下来在用API_SECRET对上面生成这个字符串join_str做hmac-sha256 签名,并且以16进制编码,得到signature
  4. 将上述得到的timestampnonce,signature,与 API_KEY按照 #{k}=#{v}并以 ',' 为区分拼接在一起形成新的字符串,这就是要返回签名认证字符串authorization;
  5. 当完成以上4步,我们就可以获取最终的签名认证字符串了。调用接口时,将通过签名认证步骤得到的值authorization 传给HTTP HEADER的Authorization对应的值;请求体部分按照相对应文档请求参数说明正确填写,正常发送请求,即可完成一次接口调用。

下面以java代码举例:

假设 API_KEY = "233453f1d1eb4eb5a5ad9c8dac0d02cc";
API_SECRETS = "444af44cd3a247c594438fb60d7b1d52";

1. 获得timestamp(unix时间戳),返回timestamp :"1633431976787"

实现方式:

 String timestamp = Long.toString(System.currentTimeMillis()); 

2. 获得随机nonce,返回nonce: "3isQFsTjsnNOLvIPXhf3HlW17WSfQqp9"

可用下面方式实现:

String nonce = RandomStringUtils.randomAlphanumeric(32);

3.将timestamp、nonce、API_KEY 这三个字符串依据“字符串首位字符的ASCII码”进行升序排列(排序过程中若出现ASCII码值相同的情况,则依次递增对下一位进行比较),并join成一个字符串,返回join_str:"1633431976787233453f1d1eb4eb5a5ad9c8dac0d02cc3isQFsTjsnNOLvIPXhf3HlW17WSfQqp9"

可用下面方式实现:

public static String genOriString(String timestamp,String nonce,String API_KEY){ArrayList<String> beforesort = new ArrayList<String>();beforesort.add(API_KEY);beforesort.add(timestamp);beforesort.add(nonce);Collections.sort(beforesort, new SpellComparator());StringBuffer aftersort = new StringBuffer();for (int i = 0; i < beforesort.size(); i++) {aftersort.append(beforesort.get(i));}String join_str = aftersort.toString();return join_str;}

4. 用API_SECRET对join_str做hmac-sha256签名,且以16进制编码,返回signature:"7d37d14406323f0ab30d1d4db1e7f2eb27abac42f3de00d619025108fa6cd5e4"

可用下面方式实现:

public static String genEncryptString(String join_str, String API_SECRET){Key sk = new SecretKeySpec(API_SECRET.getBytes(), "HmacSHA256");Mac mac = Mac.getInstance(sk.getAlgorithm());mac.init(sk);final byte[] hmac = mac.doFinal(join_str.getBytes());//完成hmac-sha256签名StringBuilder sb = new StringBuilder(hmac.length * 2);Formatter formatter = new Formatter(sb);for (byte b : hmac) {formatter.format("%02x", b);}String signature = sb.toString();//完成16进制编码return signature;}

5. 将上述的值按照 #{k}=#{v} 并以 ',' join在一起,返回签名认证字符串:
"key=2371d3f1d1eb4eb5a5ad9c8dac0d02cc,timestamp=1638431976741,nonce=3isWSsTjsnNOLvIPXhf3HlW17WSfQqp9,signature=7d37d14406323f0ab30d1d4db1e7f2eb27abac42f3de00d619025108fa6cd5e4"

可用下面方式实现:

public static String genauthorization(String API_KEY, String timestamp, String nonce, String signature){String authorization = "key=" + API_KEY+",timestamp=" + timestamp+",nonce=" + nonce+",signature=" + signature;return authorization;}

6. 将该签名认证字符串赋值给HTTP HEADER 的 Authorization 中,完成一次接口访问。

DEMO

pom文件中添加一下支持

     <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>RELEASE</version><scope>compile</scope></dependency>

具体实现代码:


import java.util.Comparator;public class SpellComparator implements Comparator<Object> {public int compare(Object o1, Object o2) {try{String s1 = new String(o1.toString().getBytes("GB2312"), "ISO-8859-1");String s2 = new String(o2.toString().getBytes("GB2312"), "ISO-8859-1");return s1.compareTo(s2);}catch (Exception e){e.printStackTrace();}return 0;}
}
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Formatter;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.http.client.ClientProtocolException;public class GenerateString {// 开放平台注册获取id(API KEY)public static final String id = "22bfe9745135";// 开放平台注册获取密钥(API SECRET)public static final String secret = "19fbdc10";private static final String HASH_ALGORITHM = "HmacSHA256";static String timestamp = Long.toString(System.currentTimeMillis());static String nonce = RandomStringUtils.randomAlphanumeric(32);public static String genOriString(String api_key){ArrayList<String> beforesort = new ArrayList<String>();beforesort.add(api_key);beforesort.add(timestamp);beforesort.add(nonce);Collections.sort(beforesort, new SpellComparator());StringBuffer aftersort = new StringBuffer();for (int i = 0; i < beforesort.size(); i++) {aftersort.append(beforesort.get(i));}String OriString = aftersort.toString();return OriString;}public static String genEncryptString(String genOriString, String api_secret)throws SignatureException {try{Key sk = new SecretKeySpec(api_secret.getBytes(), HASH_ALGORITHM);Mac mac = Mac.getInstance(sk.getAlgorithm());mac.init(sk);final byte[] hmac = mac.doFinal(genOriString.getBytes());StringBuilder sb = new StringBuilder(hmac.length * 2);@SuppressWarnings("resource")Formatter formatter = new Formatter(sb);for (byte b : hmac) {formatter.format("%02x", b);}String EncryptedString = sb.toString();return EncryptedString;}catch (NoSuchAlgorithmException e1){throw new SignatureException("error building signature, no such algorithm in device "+ HASH_ALGORITHM);}catch (InvalidKeyException e){throw new SignatureException("error building signature, invalid key " + HASH_ALGORITHM);}}public static String genHeaderParam(String api_key, String api_secret) throws SignatureException{String GenOriString = genOriString(api_key);String EncryptedString = genEncryptString(GenOriString, api_secret);String HeaderParam = "key=" + api_key+",timestamp=" + timestamp+",nonce=" + nonce+",signature=" + EncryptedString;System.out.println(HeaderParam);return HeaderParam;}public static void main(String[] args) throws ClientProtocolException, IOException, SignatureException{String s = genHeaderParam(id, secret);System.out.println(s);}
}

好了,今天关于开放平台之接口认证鉴权就到这里。

欢迎大家点击下方卡片关注《coder练习生》

开放平台设计之接口签名认证相关推荐

  1. Java API接口签名认证

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

  2. 科大讯飞开放平台——语音听写接口的使用

    科大讯飞开放平台--语音听写接口的使用 最近一个项目要用到一个语音识别的功能,主要目的是把用户说的话转换成文字,然后再做其他处理.找了多个语音识别的第三方SDK,比如百度语音识别.微信语音识别.科大讯 ...

  3. java接口开放平台设计,OpenApi开放平台架构实践

    WebAPI 开放平台架构实践 导读 背景 需求 场景 架构设计 总结 背景 随着业务的发展,越来越多不同系统之间需要数据往来,我们和外部系统之间产生了数据接口的对接.当然,有我们提供给外部系统(工具 ...

  4. 开放平台如何做接口的签名和加解密?

    目录 安全性 功能介绍 实现流程 开放平台依赖代码 AES加解密工具类 PlatformConfig RequestUtils PlatformService CommonCode ZuulFilte ...

  5. 通用接口开放平台设计与实现——(2)功能架构

    前面说过,接口开放平台主要有两部分功能组成,一是处于主体地位的API接口,对外提供数据服务:二是处于辅助角色的消息服务,用于通知数据变动. 实际上,客观上还需要平台自身管理功能,来维护平台的基础数据和 ...

  6. IM开放平台的客户端接口设计,千牛用了JAR包形式?

    千牛最早SDK封装了所有的数据交换,也就是ISV不论是Native还是H5,都会通过千牛底层和远端做数据交换(这和业内已有的开放平台模式直接调用不同),当时是出于安全策略的需要,但这层的代理却给这种优 ...

  7. 简谈“开放平台”设计中的一些感悟

    从2012年11月份实习开始,到现在2013年9月已经算是工作将近一年时间了,个人是从工作中学到了不少东西的.刚进公司的时候主要是负责平台服务器开发,后来由于我对前端的一些偏向,所有年后不久就转到公司 ...

  8. 支付宝开放平台当面付接口整体解析

    开放平台基础技术文档:https://doc.open.alipay.com/doc2/detail.htm?treeId=115&articleId=104103&docType=1 ...

  9. 微信开放平台Android应用的签名

    微信开放平台Android应用签名的本质便是我们签名文件keystore的MD5值. keytool -list -v -keystore qj_test.keystore 获得: 别名: naoli ...

最新文章

  1. Office 2003出现发送错误报告怎么办
  2. ASP.NET 3.5 的 ListView 控件与 CSS Friendly
  3. 概念模型让产品更简单
  4. 提高PHP代码质量需要注意的地方三
  5. 思考题目,仔细检查,外加一个ceil函数
  6. windows下cmd中清屏
  7. html 语义化标签拾遗
  8. ReactNative环境配置
  9. action在java_@Action(value=/login在java语句中是什么意思
  10. 23种设计模式-备忘录模式
  11. html显示日期时间代码,JS全中文显示日期时间代码
  12. Cacti auth.php,Liunx运维监控_shark巨菜_cacti篇
  13. java基础篇(二) ----- java面向对象的三大特性之继承
  14. 安装完永中office2009不能正常启动
  15. 树莓派能学linux吗,用树莓派能高效学习Linux和Python吗?
  16. 最小二乘支持向量机(LSSVM)详解
  17. 企业如何安装linux软件下载,linux系统安装软件方法大全
  18. 云计算技术实际上就是计算机网络的,浅析计算机网络的云计算技术.doc
  19. php创建菜单_php实现微信公众号创建自定义菜单
  20. 香甜的黄油 图论—最短路径

热门文章

  1. Configure Database Mirroring
  2. 【软件测试】测试大纲编写模板范文
  3. 20 React项目生成及部署
  4. ML302 OpenCPU系列(7)---AW8733A音频PA调试
  5. 4.基于Android 12 分析系统启动过程
  6. 专访Cisco 梁永健:网络会议撬动SaaS市场
  7. webapp通过点击调用高德地图或百度地图导航
  8. oracle修改数据前备份,Oracle 之利用BBED修改数据块SCN—-没有备份数据文件的数据恢复...
  9. css3渐变—渐变_玩渐变
  10. 网页请求localhost可以,但是请求ip地址就会出现连接超时