Android 中实现 HMAC-SHA256 📅 发布时间:2026/7/12 13:00:44 👁️ 浏览次数: 按指定格式拼接原始字符串、UTF-8编码、HMAC-SHA256加密、转十六进制字符串兼容Java 8Android/后端通用并做好异常处理和注释直接复制就能用。核心说明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_ALGORITHMHmacSHA256;// 十六进制字符集固定privatestaticfinalchar[]HEX_CHARS0123456789abcdef.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/secretStringrawStrString.format(dev%stimestamp%dnonce%ssecret%s,dev,timestamp,nonce,secretKey);// 2. 将字符串和秘钥编码为UTF-8字节数组byte[]rawBytesrawStr.getBytes(StandardCharsets.UTF_8);byte[]secretBytessecretKey.getBytes(StandardCharsets.UTF_8);// 3. 初始化HMAC-SHA256加密器SecretKeySpecsecretKeySpecnewSecretKeySpec(secretBytes,HMAC_SHA256_ALGORITHM);MacmacMac.getInstance(HMAC_SHA256_ALGORITHM);mac.init(secretKeySpec);// 4. 计算HMAC-SHA256并转十六进制字符串byte[]signBytesmac.doFinal(rawBytes);returnbytesToHex(signBytes);}/** * 字节数组转十六进制字符串小写 * param bytes 加密后的字节数组 * return 十六进制小写字符串 */privatestaticStringbytesToHex(byte[]bytes){char[]resultnewchar[bytes.length*2];for(inti0;ibytes.length;i){intvalbytes[i]0xFF;// 消除符号位影响result[i*2]HEX_CHARS[val4];// 高4位result[i*21]HEX_CHARS[val0x0F];// 低4位}returnnewString(result);}// 测试示例可直接运行验证publicstaticvoidmain(String[]args){try{// 测试参数StringdevDEVICE123456;longtimestamp1735689600;Stringnonceabcdefg1234567;StringsecretKeymyDeviceSecret123;// 计算签名StringsignaturecalculateDeviceSignature(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开发无需额外依赖直接复制即可Android SDK 194.4完全支持StandardCharsets.UTF_8低版本19可替换为UTF-8字符串// 低版本Android替换编码方式byte[]rawBytesrawStr.getBytes(UTF-8);byte[]secretBytessecretKey.getBytes(UTF-8);无需添加额外权限加密相关API属于Android核心库无需在清单文件声明。总结核心实现通过javax.crypto.Mac实现HMAC-SHA256手动实现字节数组转十六进制关键兼容UTF-8编码、小写十六进制输出、timestamp用long类型保证跨语言签名一致直接使用代码包含工具类、测试示例、异常处理Android/Java后端通用复制即可集成到项目中。
wep_allowed = false Android 15 的代码中,这个配置项的 Key 字符串已经被简化为 "wep_allowed",而不是之前的 "wifi_allow_wep_networks",难怪您之前搜不到。 这就是控制 WEP 默认开关的核心代码。 修改方案 请在您刚刚贴出的 WifiSettin… 2026/7/8 7:07:20
【必藏干货】AI Agent记忆系统完全指南:从短期到长期记忆的架构与实现策略,解决上下文限制的核心解决方案 记忆系统是解决AI Agent上下文限制和成本的关键技术,分为短期(会话级)和长期(跨会话)记忆。短期记忆需通过上下文工程策略(缩减、卸载、隔离)处理token限制;长期记忆依赖LLM提取、向量化存储和语义检索。行业趋势向记忆即服务(MaaS)和多模态记忆系统发展… 2026/7/11 14:05:10
西门子smart200 MODUBS轮询通讯5个英威腾变频器启动停止,状态显示和一个汇邦温控模... 西门子smart200 MODUBS轮询通讯5个英威腾变频器启动停止,状态显示和一个汇邦温控模块的温度显示和设定,断线检测,实际项目,有西门子SMART触摸屏和PLC程序 ,注释齐全,还有完整的注释IO表 凌晨三点盯着HMI上突然灰掉的2号… 2026/5/17 1:26:32
手机号逆向找回QQ号:3分钟快速解决遗忘密码的终极方案 手机号逆向找回QQ号:3分钟快速解决遗忘密码的终极方案 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾因更换手机号而彻底忘记绑定的QQ号码?或是需要帮助亲友验证手机与QQ的关联关系?今天… 2026/7/12 13:09:53
多账号微博超话定时签到脚本,支持钉钉/Server酱通知提醒 本文还有配套的精品资源,点击获取 简介:用Python写的微博超话自动签到工具,能为多个微博账号分别配置要签到的超话列表,并按设定时间自动执行签到任务。登录过程模拟真实浏览器行为,兼容微博新版验证逻辑࿱… 2026/7/12 13:09:53
3分钟掌握FreeMove:彻底解决C盘空间不足的终极方案 3分钟掌握FreeMove:彻底解决C盘空间不足的终极方案 【免费下载链接】FreeMove Move directories without breaking shortcuts or installations 项目地址: https://gitcode.com/gh_mirrors/fr/FreeMove 还在为C盘空间不足而烦恼吗?每次安装新软件… 2026/7/12 13:09:53
3分钟掌握免费H5编辑器h5maker:零代码制作专业移动页面的终极指南 3分钟掌握免费H5编辑器h5maker:零代码制作专业移动页面的终极指南 【免费下载链接】h5maker h5编辑器类似maka、易企秀 账号/密码:admin 项目地址: https://gitcode.com/gh_mirrors/h5/h5maker 在移动互联网时代,你是否曾为制作精美的… 2026/7/12 13:07:52
Windows 10系统优化终极指南:使用Win10BloatRemover彻底清理系统臃肿 Windows 10系统优化终极指南:使用Win10BloatRemover彻底清理系统臃肿 【免费下载链接】Win10BloatRemover Configurable CLI tool to easily and aggressively debloat and tweak Windows 10 by removing preinstalled UWP apps, services and more. Originally bas… 2026/7/12 13:05:52
AI Agent开发实战:Harness Engineering与Hermes Agent生产级部署指南 这次我们来深入探讨AI Agent开发中的关键技术——Harness Engineering,以及如何通过Hermes Agent实现生产级的AI应用部署。如果你正在寻找一套从原理到实战的完整AI Agent开发方案,这篇文章将为你提供可落地的技术路径。AI Agent不再是简单的对话机器人&… 2026/7/12 13:05:52
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14