Java 支持三种 MAC 算法:
- HmacMD5
- HmacSHA1
- HmacSHA256
但是,我需要使用 HMAC-SHA256-128 对某些内容进行签名,它是 HmacSHA256,但被截断为 128 位。
此示例及其变体已在 stackoverflow 上流传:
String MAC = hmacHelper.calculatePlainMAC("00000000", "HmacSHA256");
String bgSecretKey="1234567890ABCDEF1234567890ABCDEF";
public String calculatePlainMAC(String ascii, String algorithm)
{
Mac mac = null;
final Charset asciiCs = Charset.forName("US-ASCII");
try
{
SecretKeySpec signingKey = new SecretKeySpec(bgcSecretKey.getBytes(), algorithm);
mac = Mac.getInstance(algorithm);
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(asciiCs.encode(ascii).array());
String result = "";
for (final byte element : rawHmac)
{
result += Integer.toString((element & 0xff) + 0x100, 16);//.substring(1);
}
log.debug("Result: " + result);
return result;
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
return null;
}
catch (InvalidKeyException e)
{
e.printStackTrace();
return null;
}
}
结果:
1051cd18118219e1261f41401891fd1911a91cf1bc1751db13e10617c1221131231c31ab15613f14412c1681d7132178
这一切都很好,除了我需要一个 128 位的结果,我知道这是
FF365893D899291C3BF505FB3175E880
我不知道他们是如何达到这个结果的。我所知道的是使用的 HMAC 算法是 HmacSHA256-128。据我了解,该算法将生成 256 位结果,问题是,如何将其截断为 128 位结果,返回上面的已知结果?