news 2026/3/12 3:02:43

Android 中实现 HMAC-SHA256

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android 中实现 HMAC-SHA256

按指定格式拼接原始字符串、UTF-8编码、HMAC-SHA256加密、转十六进制字符串,(兼容Java 8+,Android/后端通用),并做好异常处理和注释,直接复制就能用。

核心说明

Java中实现HMAC-SHA256需要用到javax.crypto包下的Mac类,十六进制转换需要手动实现(Java无原生直接转的方法),同时要处理字符编码加密异常,以下是完整实现。

完整Java代码(直接可用)

包含签名计算核心方法+十六进制转换工具方法+异常处理+测试示例

importjavax.crypto.Mac;importjavax.crypto.spec.SecretKeySpec;importjava.nio.charset.StandardCharsets;importjava.security.InvalidKeyException;importjava.security.NoSuchAlgorithmException;/** * 设备登录签名计算工具 * 实现的HMAC-SHA256签名逻辑,格式:dev={dev}&timestamp={timestamp}&nonce={nonce}&secret={secretKey} */publicclassDeviceSignUtil{// 加密算法:HMAC-SHA256privatestaticfinalStringHMAC_SHA256_ALGORITHM="HmacSHA256";// 十六进制字符集(固定)privatestaticfinalchar[]HEX_CHARS="0123456789abcdef".toCharArray();/** * 计算设备登录HMAC-SHA256签名 * @param dev 设备号 * @param timestamp 时间戳(整型) * @param nonce 随机串 * @param secretKey 秘钥 * @return 十六进制签名字符串(小写) * @throws NoSuchAlgorithmException 算法不存在异常(理论上不会出现) * @throws InvalidKeyException 秘钥无效异常 */publicstaticStringcalculateDeviceSignature(Stringdev,longtimestamp,Stringnonce,StringsecretKey)throwsNoSuchAlgorithmException,InvalidKeyException{// 1. 严格按格式拼接原始字符串(注意参数名拼写:nonce/secret)StringrawStr=String.format("dev=%s&timestamp=%d&nonce=%s&secret=%s",dev,timestamp,nonce,secretKey);// 2. 将字符串和秘钥编码为UTF-8字节数组byte[]rawBytes=rawStr.getBytes(StandardCharsets.UTF_8);byte[]secretBytes=secretKey.getBytes(StandardCharsets.UTF_8);// 3. 初始化HMAC-SHA256加密器SecretKeySpecsecretKeySpec=newSecretKeySpec(secretBytes,HMAC_SHA256_ALGORITHM);Macmac=Mac.getInstance(HMAC_SHA256_ALGORITHM);mac.init(secretKeySpec);// 4. 计算HMAC-SHA256并转十六进制字符串byte[]signBytes=mac.doFinal(rawBytes);returnbytesToHex(signBytes);}/** * 字节数组转十六进制字符串(小写) * @param bytes 加密后的字节数组 * @return 十六进制小写字符串 */privatestaticStringbytesToHex(byte[]bytes){char[]result=newchar[bytes.length*2];for(inti=0;i<bytes.length;i++){intval=bytes[i]&0xFF;// 消除符号位影响result[i*2]=HEX_CHARS[val>>>4];// 高4位result[i*2+1]=HEX_CHARS[val&0x0F];// 低4位}returnnewString(result);}// 测试示例(可直接运行验证)publicstaticvoidmain(String[]args){try{// 测试参数Stringdev="DEVICE123456";longtimestamp=1735689600;Stringnonce="abcdefg1234567";StringsecretKey="myDeviceSecret123";// 计算签名Stringsignature=calculateDeviceSignature(dev,timestamp,nonce,secretKey);System.out.println("设备签名结果:"+signature);}catch(Exceptione){e.printStackTrace();}}}

异常处理说明

Java加密相关方法会抛出受检异常,需手动捕获/声明,主要异常:

  • NoSuchAlgorithmException:指定的HmacSHA256算法不存在(理论上不会出现,Java所有版本都支持);
  • InvalidKeyException:秘钥无效(如空秘钥),业务中需做秘钥非空校验;
  • 实际业务中建议在外层捕获异常,统一处理(如返回空签名、打印日志):
    // 业务中调用示例(捕获所有异常)publicStringgetSign(Stringdev,longtimestamp,Stringnonce,StringsecretKey){try{returnDeviceSignUtil.calculateDeviceSignature(dev,timestamp,nonce,secretKey);}catch(Exceptione){e.printStackTrace();returnnull;// 或返回空字符串,根据业务处理}}

Android端兼容说明

如果这段代码用于Android开发,无需额外依赖,直接复制即可:

  1. Android SDK 19+(4.4)完全支持StandardCharsets.UTF_8,低版本(<19)可替换为"UTF-8"字符串:
    // 低版本Android替换编码方式byte[]rawBytes=rawStr.getBytes("UTF-8");byte[]secretBytes=secretKey.getBytes("UTF-8");
  2. 无需添加额外权限,加密相关API属于Android核心库,无需在清单文件声明。

总结

  1. 核心实现:通过javax.crypto.Mac实现HMAC-SHA256,手动实现字节数组转十六进制;
  2. 关键兼容:UTF-8编码、小写十六进制输出、timestamp用long类型,保证跨语言签名一致;
  3. 直接使用:代码包含工具类、测试示例、异常处理,Android/Java后端通用,复制即可集成到项目中。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/11 3:21:36

实战笔记:西门子1500PLC在汽车焊装线的架构设计

西门子1500PLC博途程序实例&#xff0c;大型程序fanuc机器人汽车焊装自动生产线程序&#xff0c;程序硬件结构包括1台西门子1500PLC程序&#xff0c;2台触摸屏TP1500程序 9个智能远程终端ET200SP Profinet连接 15个Festo智能模块Profinet通讯 10台Fanuc发那科机器人Profinet通讯…

作者头像 李华
网站建设 2026/3/11 17:45:03

自动门(有完整资料)

资料查找方式&#xff1a; 特纳斯电子&#xff08;电子校园网&#xff09;&#xff1a;搜索下面编号即可 编号&#xff1a; CP-51-2021-058 设计简介&#xff1a; 本设计是基于单片机的自动门系统&#xff0c;主要实现以下功能&#xff1a; 可通过LCD1602显示温度最大值和当…

作者头像 李华
网站建设 2026/3/12 21:09:36

AI写论文新选择!4款AI论文写作工具,让期刊论文创作更简单!

你是否还在为撰写期刊、毕业论文或职称论文而感到困惑&#xff1f;在人工撰写过程中&#xff0c;面对数量庞大的文献&#xff0c;仿佛很难找到所需的资料&#xff0c;加上篇幅、格式等各种要求&#xff0c;使得人们感到无从下手。不断的修改和调整不仅消耗了耐心&#xff0c;写…

作者头像 李华
网站建设 2026/3/9 12:13:49

AI教材写作全流程解析!低查重教材生成,专业干货不容错过

谁没有在编写教材时碰到框架设计的难题呢&#xff1f;面对一张白纸&#xff0c;盯着电脑屏幕发愣半个小时&#xff0c;思考如何排序知识点却毫无头绪——是先解释概念还是先给出例子呢&#xff1f;章节的划分到底是依据逻辑还是根据课时呢&#xff1f;不断调整的大纲要么不符课…

作者头像 李华
网站建设 2026/3/12 11:07:06

基于SSM的文档管理系统的设计与实现开题报告

目录 研究背景与意义系统目标技术选型关键实现方案创新点预期成果 项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 研究背景与意义 随着信息化发展&#xff0c;企业和机构对文档管理的需求日益增长&#…

作者头像 李华