我正在尝试使用HMAC- the 256算法创建一个签名,这是我的代码。我在使用美国ASCII编码。
final Charset asciiCs = Charset.forName("US-ASCII");
final Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
final SecretKeySpec secret_key = new javax.crypto.spec.SecretKeySpec(asciiCs.encode("key").array(), "HmacSHA256");
sha256_HMAC.init(secret_key);
final byte[] mac_data = sha256_HMAC.doFinal(asciiCs.encode("The quick brown fox jumps over the lazy dog").array());
String result = "";
for (final byte element : mac_data)
{
result += Integer.toString((element & 0xff) + 0x100, 16).substring(1);
}
System.out.println("Result:[" + result + "]");我从上述代码中得到的结果是:
f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8这与wiki中显示的相同。
HMAC_SHA256("key", "The quick brown fox jumps over the lazy dog") = 0x f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8除了0x。
我正在寻找想法/意见,如果我做的一切正确或可能是,我可以改进我的代码。
发布于 2011-08-19 16:46:31
0x只是表示后面的字符表示一个十六进制字符串。
0x1A == 1Ah == 26 == 1A所以0x只是为了澄清输出的格式,不需要担心它。
发布于 2012-08-04 00:09:35
这是我的解决方案:
public static String encode(String key, String data) throws Exception {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
sha256_HMAC.init(secret_key);
return Hex.encodeHexString(sha256_HMAC.doFinal(data.getBytes("UTF-8")));
}
public static void main(String [] args) throws Exception {
System.out.println(encode("key", "The quick brown fox jumps over the lazy dog"));
}也可以返回以Base64编码的哈希:
Base64.encodeBase64String(sha256_HMAC.doFinal(data.getBytes("UTF-8")));十六进制的输出与预期的一样:
f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8发布于 2017-01-12 23:44:47
如果您使用的是番石榴,它的最新版本现在允许您使用
Hashing.hmacSha256()使用此方法的一个例子是:
String hash = Hashing.hmacSha256("mykey".getBytes(StandardCharsets.UTF_8)).hashString("my_message", StandardCharsets.UTF_8).toString()这里有更多的文档:https://guava.dev/releases/23.0/api/docs/com/google/common/hash/Hashing.html#hmacSha256-byte:A-
https://stackoverflow.com/questions/7124735
复制相似问题