首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HMAC-HMAC 256签名计算算法

HMAC-HMAC 256签名计算算法
EN

Stack Overflow用户
提问于 2011-08-19 16:41:52
回答 9查看 206.2K关注 0票数 92

我正在尝试使用HMAC- the 256算法创建一个签名,这是我的代码。我在使用美国ASCII编码。

代码语言:javascript
复制
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 + "]");

我从上述代码中得到的结果是:

代码语言:javascript
复制
f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8

这与wiki中显示的相同。

代码语言:javascript
复制
HMAC_SHA256("key", "The quick brown fox jumps over the lazy dog") = 0x f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8

除了0x

我正在寻找想法/意见,如果我做的一切正确或可能是,我可以改进我的代码。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-08-19 16:46:31

0x只是表示后面的字符表示一个十六进制字符串。

代码语言:javascript
复制
0x1A == 1Ah == 26 == 1A

所以0x只是为了澄清输出的格式,不需要担心它。

票数 44
EN

Stack Overflow用户

发布于 2012-08-04 00:09:35

这是我的解决方案:

代码语言:javascript
复制
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编码的哈希:

代码语言:javascript
复制
Base64.encodeBase64String(sha256_HMAC.doFinal(data.getBytes("UTF-8")));

十六进制的输出与预期的一样:

代码语言:javascript
复制
f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
票数 102
EN

Stack Overflow用户

发布于 2017-01-12 23:44:47

如果您使用的是番石榴,它的最新版本现在允许您使用

代码语言:javascript
复制
 Hashing.hmacSha256()

使用此方法的一个例子是:

代码语言:javascript
复制
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-

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7124735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档