news 2026/4/15 16:32:33

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/4/15 14:30:28

亲测好用!8款AI论文网站测评:本科生毕业论文全攻略

亲测好用&#xff01;8款AI论文网站测评&#xff1a;本科生毕业论文全攻略 2026年AI论文写作工具测评&#xff1a;为何要关注这些平台&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始借助AI工具辅助毕业论文写作。然而&#xff0c;面对市场上琳琅满目…

作者头像 李华
网站建设 2026/4/1 14:03:07

南港潮汐表查询2026-02-01

位置&#xff1a;南港&#xff0c;日期&#xff1a;2026-02-01&#xff0c;农历&#xff1a;乙巳[蛇]年十二(腊)月十四&#xff0c;星期&#xff1a;星期天&#xff0c;潮汐类型&#xff1a;大潮活汛最高水位&#xff1a;362.00cm&#xff0c;最低水位&#xff1a;47.00cm&…

作者头像 李华
网站建设 2026/4/8 22:14:04

AI写论文大推荐!4款AI论文写作工具,提升你的论文创作效率!

AI论文写作工具推荐 还在为撰写期刊论文感到烦恼吗&#xff1f;面对海量的参考文献、繁杂的格式要求&#xff0c;加上不断的修订&#xff0c;许多学者都觉得写论文的效率低得让人沮丧&#xff01;别担心&#xff0c;今天我将为大家推荐四款实测过的AI论文写作工具。这些工具不…

作者头像 李华
网站建设 2026/4/12 15:38:21

高效秘籍|AI生成教材实用攻略,轻松实现低查重目标!

教材编写困境与 AI 工具的出现 教材初稿终于完成&#xff0c;但在修改优化的过程中真的是像“折磨”一样&#xff01;仔细通读全文&#xff0c;查找逻辑不通或知识点不准确的地方&#xff0c;花费的时间真的不少&#xff1b;一旦调整某个章节的结构&#xff0c;后续的多个部分…

作者头像 李华
网站建设 2026/4/12 1:54:38

FatigueNet-PhysFreqPro:基于多层级物理机理嵌入与自适应频率疲劳约束的机械退化趋势预测(Pytorch)

算法特点多层级物理机理深度嵌入将轴承Hertz接触理论、运动微分方程、故障频率特性和材料疲劳损伤模型4个层级的物理机理嵌入神经网络材料疲劳损伤约束机制地将材料S-N曲线疲劳模型和Paris裂纹扩展定律作为物理约束引入损失函数&#xff0c;使预测结果遵循材料疲劳损伤累积的物…

作者头像 李华