首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带密钥的Java HmacSHA256

带密钥的Java HmacSHA256
EN

Stack Overflow用户
提问于 2017-10-28 18:10:27
回答 2查看 13.4K关注 0票数 4

我尝试了来自stackoverflow的几个链接,以获得使用java的带有密钥的HmacSHA256,但我总是得到

代码语言:javascript
复制
 func check(body: String) -> String {
    let hash = body.hmac(HMACAlgorithm.sha256, key: Router.sigKey)
    print("SIG: " + Router.sigKey)
    print("result of hash. \(hash)")
    return hash
}

此函数返回给定字符串中的带有关键字的哈希。密钥是: 0393e944ee8108bb66fc9fa4f99f9c862481e9e0519e18232ba61b0767eee8c6

字符串是:示例

结果是: 27effb76c97022497e25d3a5d7e823462f212a82d9ebba35f179071568b0c335

当我在this网站上用相同的密钥检查我的SHA256是否正常时,返回的结果是相同的,所以我知道我在swift中的代码是好的。但是当我尝试用java来做这件事的时候,下面是源代码。

代码语言:javascript
复制
public static String HMAC_SHA(){
    try {
        String secret = "0393e944ee8108bb66fc9fa4f99f9c862481e9e0519e18232ba61b0767eee8c6";
        String message = "example";
        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
        sha256_HMAC.init(secret_key);
        String hash = android.util.Base64.encodeToString(sha256_HMAC.doFinal(message.getBytes()), Base64.URL_SAFE);
        return new String(Hex.encodeHex(hash.getBytes()));
    }
    catch (Exception e){
        e.printStackTrace();
    }
    return null;
}

它返回以下内容: 4a2d5f3764736c77496b6c2d4a644f6c312d676a526938684b6f4c5a36376f3138586b4846576977777a553d0a

这甚至与快速输出并不相似。我怎样才能用java从上面的快速代码中获得同样的结果,这会很有帮助的!

EN

回答 2

Stack Overflow用户

发布于 2018-08-21 05:19:12

代码语言:javascript
复制
    String key = "0393e944ee8108bb66fc9fa4f99f9c862481e9e0519e18232ba61b0767eee8c6";
    Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
    sha256_HMAC.init(new SecretKeySpec(key.getBytes(), "HmacSHA256"));
    byte[] result = sha256_HMAC.doFinal("example".getBytes());
    System.out.println (DatatypeConverter.printHexBinary(result));
    // ONLY CONVERT TO HEX (= SWIFT) NOT FIRST TO BASE64

请求的结果

代码语言:javascript
复制
 27EFFB76C97022497E25D3A5D7E823462F212A82D9EBBA35F179071568B0C335
票数 9
EN

Stack Overflow用户

发布于 2018-08-20 22:43:30

您的键包含的值大于值127,MacSecretKeySpec使用bytes,在Java语言中,它可以包含从-128到127的值。

在HmacSHA256算法中,密钥被解释为十六进制值的字符串。对于您的密钥,该密钥的十进制值为:3,147,233,68,238,129,8,187,102,252,159,164,249,159,156,134,36,129,233,224,81,158,24,35,43,166,27,7,103,238,232,198

如您所见,其中一些值超过127。在创建SecretKeySpec对象和在Mac类中进行计算时,Java使用byte[]来存储这个序列和相关的序列。在Java语言中,byte可以包含从-128到127的值,这意味着当存储这个secret时,> 127的值将“翻转”,并将确保后面的计算不会像您预期的那样进行。

对于Swift (以及C++、Ruby和其他语言),从十六进制到字节的转换不会丢失实际值。

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

https://stackoverflow.com/questions/46988540

复制
相关文章

相似问题

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