在Java中使用Base64 HMAC SHA1未获得预期结果

在Java中使用Base64 HMAC SHA1未获得预期结果,java,base64,hmacsha1,Java,Base64,Hmacsha1,我尝试使用HMAC SHA1单向算法 这是我的密码 @Test public void encodeTest() { String HMAC_SHA1_ALGORITHM = "HmacSHA1"; String EXPECTED_BASE_64 = "g9OrJ8pQNYprnXuBPFXcirrqpxE="; String text = "encodeme"; String result; try { SecretKeySpec

我尝试使用HMAC SHA1单向算法

这是我的密码

@Test
public void encodeTest() {

    String HMAC_SHA1_ALGORITHM = "HmacSHA1";
    String EXPECTED_BASE_64 = "g9OrJ8pQNYprnXuBPFXcirrqpxE=";

    String text = "encodeme";
    String result;

    try {
        SecretKeySpec signingKey = new SecretKeySpec(
                "MSbN2crsrdTEsLetTixpV46q+fTZotdZjwoEpO62vYk=".getBytes(),
                HMAC_SHA1_ALGORITHM);
        // Get an hmac_sha1 Mac instance and initialise with the signing key
        Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
        mac.init(signingKey);
        // Compute the hmac
        byte[] rawHmac = mac.doFinal(text.getBytes());
        // Convert raw bytes to Hex
        byte[] hexBytes = new Hex().encode(rawHmac);
        // Covert array of Hex bytes to a String

        result = new String(hexBytes, "ISO-8859-1");
        // Ok, this matches with the web
        System.out.println("HEX:" + result);

        String encodedBase64 = new String(Base64.encodeBase64(hexBytes));
        System.out.println("BASE64:" + encodedBase64);

        // In the web i get a smaller chain, why?
        System.out.println("EXPECTED BASE64:" + EXPECTED_BASE_64);
        Assert.assertEquals(EXPECTED_BASE_64, encodedBase64);

    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
输出为

十六进制:83D3AB27CA50358A6B9D7B813C55DC8ABEA711 BASE64:ODNKM2FimjjyTuwMZu4YTzioWQ3YJGxm2m1NWRjogFiyWhyTcXmq==

预期基准64:g9OrJ8pQNYprnXuBPFXcirrqpxE=

我使用这些在线网站定义了我的期望

text=encodeme

使用共享密钥

key=MSBN2CRRDTESLETTIV46Q+fTZotdZjwoEpO62vYk=

我得到的结果略有不同

十六进制:83D3AB27CA50358A6B9D7B813C55DC8ABEA711 十六进制:83D3AB27CA50358A6B9D7B813C55DC8ABEA711 h:e:x:83:d3:ab:27:ca:50:35:8a:6b:9d:7b:81:3c:55:dc:8a:ba:ea:a7:11 base64:g9OrJ8pQNYprnXuBPFXcirrqpxE=

正如您看到的,十六进制输出匹配100%,但是base64输出根本不匹配

为了确认问题不在那个站点,我去了另一个站点 只需使用base64编码一个十六进制字符串,我就得到了同样的结果

有人知道为什么会这样吗


提前谢谢

是否确实要对十六进制字节进行base64编码,而不是对
rawHmac
?我添加了字符串encodedRawMacBase64=新字符串(base64.encodeBase64(rawHmac));System.out.println(“原始BASE64:+encodedRawMacBase64”);是的,我得到了我想要的结果。你救了我的命。明亮的