核心内容摘要
十八岁,一场未完待续的“湿”意人生
按指定格式拼接原始字符串、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{//
严格按格式拼接原始字符串注意参数名拼写nonce/secretStringrawStrString.format(dev%stimestamp%dnonce%ssecret%s,dev,timestamp,nonce,secretKey);//
将字符串和秘钥编码为UTF-8字节数组byte[]rawBytesrawStr.getBytes(StandardCharsets.UTF_
;byte[]secretBytessecretKey.getBytes(StandardCharsets.UTF_
;//
初始化HMAC-SHA256加密器SecretKeySpecsecretKeySpecnewSecretKeySpec(secretBytes,HMAC_SHA256_ALGORITHM);MacmacMac.getInstance(HMAC_SHA256_ALGORITHM);mac.init(secretKeySpec);//
计算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
1