常用的请求认证方式有两种:

1、Signature认证

一次性的身份校验方式,常见于不同项目间的api通信
一般形式是通过 AppID/AccessKey/AppSecret 及签名算法针对通信数据生成签名
AccessKey作为公钥,AppSecret作为私钥,AppSecret不能放在网络上传输
接口数据推送时,会随带上AppID、AccessKey、Timestamp 及 Signature
在服务端同样留存着一份相同的 AppID/AccessKey/AppSecret 配置
服务端接受到请求后通过AppID对应出匹配的AppSecret,结合相同的签名算法计算签名,并与请求附带的签名做校验
时间戳可以防止恶意用户截取到签名后进行伪装请求,使签名只在一定时间范围内有效,过期后不能再请求
由于每次请求的数据载荷不同,所以一般每次请求都会产生不同的签名.

2、Token认证

状态可维持的身份校验方式,常见于第三方服务或APP接口的OAUTH2认证中
一般形式是通过 账号/密码 或 clientId/clientSecret 向认证服务请求Token
服务端Authenticate通过后返回Token,并在一定时间内对Token及相应账号信息进行缓存
后续的接口通信都将通过Token来进行认证
在一段活跃期内, 连续的请求Token是相同

本文主要介绍签名认证的主要实现方式

客户端:

(1)封装一个获取时间戳、生成签名的工具类

package com.solin.tools.utils;import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Formatter;public class EncryptedUtil {/** HMACSHA256加密签名* Hash-based Message Authentication Code  SHA256* @param sourceStr 加密的源字符串* @param secretAccessKey 密钥*/public static String getSign(String sourceStr,String secretAccessKey) throws Exception{SecretKey secretKey = new SecretKeySpec(secretAccessKey.getBytes(),"HmacSHA256");Mac mac = Mac.getInstance(secretKey.getAlgorithm());mac.init(secretKey);final byte[] hmac = mac.doFinal(sourceStr.getBytes());StringBuilder stringBuilder = new StringBuilder(hmac.length*2);Formatter formatter = new Formatter(stringBuilder);for (byte b :hmac){formatter.format("%02x",b);}formatter.close();return stringBuilder.toString();}/** MD5加密* @param sourceStr 加密的源字符串*/public static String MD5(String sourceStr) {String result = "";try {MessageDigest md = MessageDigest.getInstance("MD5");md.update(sourceStr.getBytes("UTF-8"));byte b[] = md.digest();int i;StringBuffer buf = new StringBuffer("");for (int offset = 0; offset < b.length; offset++) {i = b[offset];if (i < 0)i += 256;if (i < 16)buf.append("0");buf.append(Integer.toHexString(i));}result = buf.toString();} catch (Exception e) {e.printStackTrace();}return result;}/** 时间转换成unix时间戳* @param dateStr 时间字符串*/public static Long getUnixTimestamp(String dateStr){SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");try {Date date = simpleDateFormat.parse(dateStr);return  date.getTime();} catch (ParseException e) {return null;}}

(2)封装一个简单的日期工具类

package com.solin.tools.utils;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** 日期工具类*/
public class DateUtils {//logprivate final static Logger logger = LoggerFactory.getLogger(DateUtils.class);private DateUtils(){}//Srting转datepublic static Date changeStringToDate(String dateStr) {Date date = new Date();try {date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateStr);} catch (ParseException e) {logger.error(e.getMessage());}return date;}//Srting转date精确到毫秒public static Date changeStringToMillisecondDate(String dateStr) {Date date = new Date();try {date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(dateStr);} catch (ParseException e) {logger.error(e.getMessage());}return date;}//date转String精确到毫秒public static String changeDateToMillisecondString(Date date) {String dateStr = "";try {dateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(date);} catch (Exception e) {logger.error(e.getMessage());}return dateStr;}}

(3)生成时间戳和签名测试

package com.solin.tools;import com.solin.tools.utils.SignResult;/*** 生成签名测试*/
public class SignTest {public static void main(String[] args) throws Exception{ String appId = "123456";String accessKey = "e16188442d8f460696bddf2b";String secretKey = "c0248ad5cced4820835ad54d90ba1fe0";String timestamp = DateUtils.changeDateToMillisecondString(new Date());
// 将timestamp转化为unix时间戳long timestampLong = EncryptedUtil.getUnixTimestamp(timestamp);// 拼接字符串String requestStr = timestampLong + appId + accessKey;// MD5字符串String requestMd5Str = EncryptedUtil.MD5(requestStr);// 生成签名String sign = EncryptedUtil.getSign(requestMd5Str ,secretKey);System.out.println("timestamp ===>>> " + timestamp);System.out.println("sign ===>>> " + sign);}
}

服务端:

(1)时间戳及签名校验工具类


/*** API鉴权工具类* 1、校验时间戳* 2、校验签名 */
public class AppAuthenticationUtils {//log日志private static final Logger logger = LoggerFactory.getLogger(AppAuthenticationUtils.class);//鉴权时间戳范围,单位毫秒public static final long scopeTime = 300000L;/*** API鉴权* @param appId 应用ID* @param accessKey 访问密钥* @param secretKey 签名密钥* @param requestTimestamp 时间戳* @param signature 签名*/public static ResponseStatus checkAuthentication(String appId , String accessKey , String secretKey,String requestTimestamp, String signature)  {long requestUnixTimestamp = EncryptedUtil.getUnixTimestamp(requestTimestamp);// 校验请求时间戳if (!checkRequestTimestamp(requestUnixTimestamp , scopeTime)){return new ResponseStatus(false, "Invalid requestTimestamp ...");}// 校验签名if (!checkSignature(appId, accessKey, secretKey, requestTimestamp,signature)){return new ResponseStatus(false, "Invalid signature...");}return new ResponseStatus(true, "鉴权通过");}/*** 校验签名* @param appId 应用ID* @param accessKey 接口密钥* @param requestTimestamp 时间戳* @param signature 签名*/private static boolean checkSignature(String appId, String accessKey, String secretKey, String requestTimestamp,String signature) {boolean isAuthPass = false;try {long requestUnixTimestamp = EncryptedUtil.getUnixTimestamp(requestTimestamp);String requestMd5Str = EncryptedUtil.MD5(requestUnixTimestamp + appId + accessKey);String sign = EncryptedUtil.getSign(requestMd5Str ,secretKey);if (StringUtils.isNotEmpty(sign) && sign.equals(signature)){isAuthPass = true;}} catch (Exception e) {logger.error("Interface authentication failed ", e);}return isAuthPass;}/*** 判断失效时间* @param requestUnixTimestamp unix时间戳*/private static boolean checkRequestTimestamp(long requestUnixTimestamp  ,long scopeTime){boolean isVaildTimestamp = false;long currentTime = System.currentTimeMillis();long minVaildTime = currentTime - scopeTime;long maxVaildTime = currentTime + scopeTime;if (requestUnixTimestamp >= minVaildTime && requestUnixTimestamp <= maxVaildTime){isVaildTimestamp = true;}return isVaildTimestamp;}}

签名(Signature)认证实现方式-用于请求鉴权相关推荐

  1. openresty 请求鉴权

    openresty 请求鉴权 请求发往后端前,先对请求进行鉴权,鉴权通过发往后端 请求鉴权 auth_request 鉴权 请求发往后端前,auth_request发送子请求: 返回的状态码2xx,请 ...

  2. K8s认证机制、kubeconfig及配置、Service Account,K8s鉴权体系、RBAC及配置案例、Ingress工作机制,Ingress配置方式及金丝雀发布案例、Helm及常见用法

    添加两个以上静态令牌认证的用户,例如 tom 和 jerry,并认证到 Kubernetes 上: #生成token root@k8s-master01:~# echo "$(openssl ...

  3. ak sk认证java demo_AK-SK鉴权

    插件名称类别 名称 描述 属性 服务插件 AK/SK 鉴权 gw-ak_sk_auth 用户鉴权 功能描述 配置自己的AK/SK,或是使用网关自动生成的AK/SK,完成认证. 客户端涉及的AK/SK签 ...

  4. 技术探究|Apache Pulsar 认证与鉴权实践指南

    文章摘要 本文整理自 2022 年 8 月 Apache Pulsar Meetup 上傅腾题为<Apache Pulsar 企业级安全实践>的分享.数据安全已经成为企业的一项重要竞争优势 ...

  5. 快捷支付各种绑卡鉴权方式

    1.背景 互联网金融平台账户进行开户或者支付业务时,绑卡鉴权环节是必经之路. 那么什么是绑卡鉴权?绑卡是将用户银行卡信息提供给金融平台,以后金融平台就用这个信息去银行完成支付.绑卡实际上是一个授权,让 ...

  6. 互联网金融平台常见绑卡鉴权方式分析对比

    1.背景 互联网金融平台账户进行开户或者支付业务时,绑卡鉴权环节是必经之路. 那么什么是绑卡鉴权?绑卡是将用户银行卡信息提供给金融平台,以后金融平台就用这个信息去银行完成支付.绑卡实际上是一个授权,让 ...

  7. kubernetes集群安全——认证、鉴权、准入控制

    机制说明 Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务.API Server 是集群内部各个组件通信的中介,也是外部控制的入口.所以 Kubernetes 的 ...

  8. 软件测试 接口测试 接口鉴权 token鉴权 Mock Server 接口加解密 接口签名sign

    文章目录 1 接口鉴权 1.1 cookie鉴权 1.2 session鉴权 1.3 token鉴权 1.4 Postman的鉴权方式 2 Mock Server 3 接口加解密 3.1 加密方式 3 ...

  9. 鉴权 前后端常见的几种鉴权方式

    https://juejin.cn/post/6844903927100473357 鉴权(authentication)是指验证用户是否拥有访问系统的权利.传统的鉴权是通过密码来验证的.这种方式的前 ...

最新文章

  1. 区块链应用和法律规范
  2. C++语言程序设计之关联容器类型
  3. MyBatisPLus3.x中代码生成器自定义数据库表字段类型转换
  4. ecshop根目录调用_ecshop列表页 调用二级分类教程
  5. Abp vNext 二进制大对象系统(BLOB)
  6. php autoload用法,php自动加载__autoload()函数用法
  7. 关于tomcat Post 数据参数的问题
  8. VMware里装XP 没有找到硬盘驱动器
  9. sigkill mysql_Ubuntu不能停止mysqld
  10. 【java】java的Jaas授权与鉴权
  11. 关于HTML+CSS3的一些笔记
  12. CarMaker快速入门
  13. 画图软件Microsoft visio下载安装及使用
  14. [ActionSprit 3.0] FMS安装与测试
  15. es6 箭头函数 模板字符串 点点点运算符
  16. 能上QQ不能上浏览器处理方法(win11版)
  17. The server returned the following error: 无法与服务器建立连接(0x80072EFD)
  18. Python项目实战:各种小说姓名生成器
  19. PostgreSQL 9.1 选项standard_conforming_strings默认值为on
  20. 终于解决了hao123锁定主页的问题~

热门文章

  1. 下班理财超过上班赚钱
  2. Windows Server 2008 R2终端服务器远程授权激活
  3. DHCP服务器在企业里的各种应用方案
  4. ReentrantLock类源码解析
  5. php %3ch1%3e字体,phpWebSite搜索模块跨站脚本执行漏洞
  6. php 第一次创建文件时延迟4秒 sleep用法
  7. oracle或mysql分组查询并且获取前3条排序后的数据
  8. JVM优化系列-String对象在虚拟机中的实现
  9. k8s各类yaml文件
  10. 好文荐读 | 阿里巴巴为什么不用 ZooKeeper 做服务发现?