首页 > 其他分享 >HMAC-SHA256签名

HMAC-SHA256签名

时间:2023-10-12 18:15:16浏览次数:23  
标签:return String request HMAC 签名 new SHA256 public append

一.需求

请求加上Authorization头部,按指定格式添加校验内容。Authorization包含以下几个方面信息:
  • 校验方式:固定为HMAC-SHA256
  • timestamp:当前时间的13位毫秒时间戳
  • signature:请求签名,按指定方式生成

二.实现

private boolean authorizationValidation(HttpServletRequest request) {
    CachedBodyHttpServletRequest cachedRequest = (CachedBodyHttpServletRequest) request;
    String authorizationHeader = request.getHeader("Authorization");try {
      // 解析 Authorization 值
      String[] authValues = authorizationHeader.split(",");
      String timestamp = authValues[1];
      String body = cachedRequest.getBody();
      if (body == null) {
        body = "";
      }
      String receivedSignature = authValues[2];
      String path = request.getRequestURI();
      String query = request.getQueryString();
      if (StringUtils.isNotBlank(query)) {
        path += "?" + query;
      }
      // 构建参与签名的字符串
      StringBuilder stringToSign = new StringBuilder();
      stringToSign.append(path).append("\n");
      stringToSign.append(timestamp).append("\n");
      stringToSign.append(body).append("\n");// 使用 HMAC-SHA256 算法进行签名
      SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8),
          algorithm);
      Mac mac = Mac.getInstance(algorithm);
      mac.init(signingKey);
      byte[] signatureBytes = mac.doFinal(stringToSign.toString().getBytes(StandardCharsets.UTF_8));

      // 对签名进行 Base64 编码
      String calculatedSignature = Base64.getEncoder().encodeToString(signatureBytes);// 对比签名值
      if (calculatedSignature.equals(receivedSignature)) {return true;
      }
    } catch (NoSuchAlgorithmException | InvalidKeyException e) {
      e.printStackTrace();
      log.info(e.getMessage());
    }
    return false;
  }

public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper {

private final byte[] cachedBody;

public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException {
super(request);
InputStream requestInputStream = request.getInputStream();
this.cachedBody = StreamUtils.copyToByteArray(requestInputStream);
}

@Override
public ServletInputStream getInputStream() {
return new CachedBodyServletInputStream(this.cachedBody);
}

@Override
public BufferedReader getReader() throws IOException {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(this.cachedBody);
return new BufferedReader(new InputStreamReader(byteArrayInputStream));
}

public String getBody() {
return new String(cachedBody);
}
}

public abstract class StreamUtils {
public static final int BUFFER_SIZE = 4096;

public StreamUtils() {
}

public static byte[] copyToByteArray(InputStream in) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream(4096);
copy(in, out);
return out.toByteArray();
}

public static int copy(InputStream in, OutputStream out) throws IOException {
int byteCount = 0;
byte[] buffer = new byte[4096];

int bytesRead;
for(boolean var4 = true; (bytesRead = in.read(buffer)) != -1; byteCount += bytesRead) {
out.write(buffer, 0, bytesRead);
}

out.flush();
return byteCount;
}
}
 

 

标签:return,String,request,HMAC,签名,new,SHA256,public,append
From: https://www.cnblogs.com/Anti-General/p/17760196.html

相关文章

  • TF签名上架要准备哪些材料和程序?
    要准备苹果TF签名上架,需要准备以下材料和程序:开发者账号要在苹果的各种程序内获得权限,首先需要拥有一个开发者账号。对于喵分发(www.catfenfa.com)TF签名,需要使用个人开发者账号或公司开发者账号来做。ipa文件苹果上架或签名的App用的都是ipa文件格式,TF签名要求的ipa文件需......
  • Java通过itext解析PDF中的关键字得到坐标进行插入印章图片或签名
    需求因需提高公司运转效率,提倡去无纸化操作,减少人力等前提;通过系统将审核通过后的pdf文档进行盖电子印章或电子签名等功能;测试效果如下:图1图2实现思路因如上图1中,存在动态表格,所以文档的布局是随数据而变的,可能是多页,可能是一页,且内容上下浮动,所以得通过解析文档内容,通过......
  • 苹果企业签名为何要分发?
    苹果企业签名需要分发的原因是,它能够保证企业分发的应用程序是合法、可靠、安全、稳定的,并且能够在企业设备上正常运行。喵分发(www.catfenfa.com)通过企业签名,开发者可以将应用直接发布到用户的设备上,无需经过苹果的审核和上架AppStore,这样就能够更好地控制应用程序的适用范围和权......
  • 苹果TF签名的服务流程
    苹果TF签名的服务流程一般如下:客户需要提供应用的ipa包,而不需要进行预审,上传即付钱即审核。需要先预览App图标。应用在申请签名时需要提供icon,而icon需要经过苹果alpha通道的审核才能使用。需要提供BundleID,一个可重复使用唯一标识符来帮助用户唯一地识别和找到这个App的所......
  • 喵分发平台助力iOS超级签名
    (喵分发)www.catfenfa.com平台可以帮助iOS进行超级签名,以下是一些建议:提供稳定的签名服务:超级签名需要使用个人开发者账号,并向其中添加苹果设备的UDID,生成签名用的描述文件,对应用进行签名。在签名过程中,需要确保使用的签名证书是稳定的,并定期更新证书密钥和吊销列表,以避免掉签问题......
  • 前端canvas实现签名功能,可以横屏/竖屏签名
    页面展示效果,点保存后生成图片链接图片链接展示效果这里只展示了竖屏签名效果,横屏自己粘贴代码测试css.box{width:98%;display:flex;flex-direction:column;margin:auto;}.canvasbox{width:100%;border:1pxsolid#bbb;margin:0auto;overflow:hidden;}canvas......
  • C/C++学习 -- HMAC算法
    1.HMAC算法概述HMAC,全称为HMAC-MD5、HMAC-SHA1、HMAC-SHA256等,是一种在数据传输中验证完整性和认证来源的方法。它结合了哈希函数和密钥,通过在数据上应用哈希函数,生成一个带密钥的散列值,用于验证数据的完整性。HMAC算法广泛应用于网络协议、数字签名、认证和访问控制等领域。2.HM......
  • dockerfile 由于公钥不可用,无法验证以下签名
    报错当我在打包docker镜像时,发生了报错$sudodockerbuild-tdcgm-exporter:3.2.5.1.772Thefollowingsignaturescouldn'tbeverifiedbecausethepublickeyisnotavailable:NO_PUBKEYA4B469963BF863CC……42.77W:GPGerror:https://developer.download.......
  • android签名检测和绕过
    PackageManagerService获取签名正常APP中获取PackageInfo中的签名信息是通过Binder通讯向PackageManagerService发送TRANSACTION_getPackageInfo请求,同时设置请求的参数的flag为GET_SIGNATURES。当PackageManagerService判断是TRANSACTION_getPackageInfo请求后会去调用PackageMa......
  • 2023年最新京东app端sign签名算法与cipher加解密逆向分析(2023-09-26)
    前言:  本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,若有侵权请联系我删除!技术交流合作请私信!一.工具的选择(抓包工具的选择,是门学问)用到工具如下:1、安卓手机一台,系统版本:android6.01;型号:小米MI4LTE  之所以要选择android6手机,原理如下:  ......