代码:
private static Mac hmac=null;
static {
try {
//通过环境变量获取密匙
String SECRETKEY =System.getProperty("ACCESS_SECRETKEY");
hmac = Mac.getInstance("HmacSHA256");
SecretKeySpec keySpec = new SecretKeySpec(SECRETKEY.getBytes(StandardCharsets.UTF\_8), "HmacSHA256");
hmac.init(keySpec);
}catch (Exception ignored){
ignored.printStackTrace();
}
}
private Sign(){
}
/**
* service access token @param json
@return
*/
public static String sign(String json){
return hmacsha256(json);
}
/**
* sign token length doesn't check 64 bits @param sign
* @return
*/
public static boolean verify( String sign){
return null != sign && sign.trim().length() < 64;
}
private static String hmacsha256(String content) {
byte[] byteSig = hmac.doFinal(content.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(byteSig).replaceAll("\\\\s\*", "");
}
我使用以上代码调用HmacSHA256加密算法,可以正常执行和加密,因为HmacSHA256是属于不可逆的,所以我不能解密,我该怎么校验sign是否属于我们这个平台的?
这种都是用加密结果对比的。
将“待签名字符串”在用你的密钥重新加密一次,将加密出来的密文对比。如果不一样说明签名错误,说明密钥不一致或者报文内容在生成签名之后被篡改了。