gpt4 book ai didi

java - Java 中生成的 HmacSha256 签名与 Go 中不同

转载 作者:IT王子 更新时间:2023-10-29 02:09:35 28 4
gpt4 key购买 nike

我正在将代码从 Go 转换为 Java。要转换的源位于 https://github.com/h2non/imaginary#url-signature这是我当前转换为 Java 的代码。

问题是我遗漏了一些东西,因为在 Java 中生成的签名与在 Go 中生成的签名不同。

预期结果(如 Go 中的源代码所示):

ruEWRoFO-ic-L38vTsjqIYE6DLZ532CTaZXOh1gwuVo

Java 中的实际结果:

x2clz4ynSxcFPNc6h3W832vyrIQ=

我的 Java 代码:

@Test
public void testSomeString() throws Exception {
String signKey = "4f46feebafc4b5e988f131c4ff8b5997";
String urlPath = "/resize";
String urlQuery = "file=image.jpg&height=200&type=jpeg&width=300";

byte[] signKeyAsBytes = signKey.getBytes("UTF-8");
SecretKey SHA256_KEY = new SecretKeySpec(signKeyAsBytes, "HmacSHA256");

byte[] hashAsBytes=Hashing.hmacSha1(SHA256_KEY)
.newHasher()
.putString(urlPath, UTF_8)
.putString(urlQuery, UTF_8)
.hash().asBytes();
String hash = Base64.getUrlEncoder().encodeToString(hashAsBytes);

//correct value in GoLang is: "ruEWRoFO-ic-L38vTsjqIYE6DLZ532CTaZXOh1gwuVo"
Assert.assertEquals("ruEWRoFO-ic-L38vTsjqIYE6DLZ532CTaZXOh1gwuVo", hash);

/*
Junit test fails with:
Expected :ruEWRoFO-ic-L38vTsjqIYE6DLZ532CTaZXOh1gwuVo
Actual :x2clz4ynSxcFPNc6h3W832vyrIQ=
*/
}

这是 Go 中的原始内容:

package main

import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"fmt"
)

func main() {
fmt.Println("Hello, playground")
signKey := "4f46feebafc4b5e988f131c4ff8b5997"
urlPath := "/resize"
urlQuery := "file=image.jpg&height=200&type=jpeg&width=300"

h := hmac.New(sha256.New, []byte(signKey))
h.Write([]byte(urlPath))
h.Write([]byte(urlQuery))
buf := h.Sum(nil)

fmt.Println("sign=" + base64.RawURLEncoding.EncodeToString(buf))
}

最佳答案

我不知道你在 Java 中使用什么 Hashing 类,因为它不是标准的,但是如果我使用标准类 javax.crypto.Mac使用该 key 和数据执行 HmacSHA256(不是 HmacSHA1)——并使用 JSON 提升的 Base64 的“未填充 URLsafe”变体进行编码,而不是 Java 默认的传统变体——我确实得到 ruEWRoFO-ic-L38vTsjqIYE6DLZ532CTaZXOh1gwuVo.

但是,在没有定界的情况下对路径和查询进行签名是非常糟糕的做法——这可能允许将签名“移动”到不同的数据。使用字符但只有十六进制数字字符的 key 也很奇怪,但并不直接危险。如果没有进行广泛的调查,我不会将这样设计的方案用于任何重要的事情。

关于java - Java 中生成的 HmacSha256 签名与 Go 中不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51259453/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com