使用针对DigitEyes Api的HMAC SHA-1哈希对请求进行签名的问题

时间:2016-01-12 18:02:45

标签: java api hmacsha1

我一直在尝试签署对DigitEyes Barcode api的请求,以便我可以检索给定条形码的产品信息。但是对于请求,我必须提交一个签名,该签名是使用授权密钥的SHA-1散列生成的,UPC和base64会对结果进行加密。 Ť 但无论我尝试多少,我都无法获得他们在一个例子中生成的签名。

他们使用的字段是: 授权密钥(“M”代码):Cf47U2b4d4Vt5Gz8

样本UPC / EAN:5201279013028

他们得到了: 样本签名:Mb + LqZ7PM4bGxJDAWB / n7 / LSj9A =

有一些例子如下所示,但是没有一个是JAVA,这是我试图用的语言。示例如下所示。

http://www.digit-eyes.com/specs/UPCAPIImplementation.pdf

我正在使用的代码如下所示,我认为它有效,但不会给我他们所拥有的代码。

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;
import java.util.Formatter;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

public class HmacSha1Signature {
    private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";

    private static String toHexString(byte[] bytes) {
        Formatter formatter = new Formatter();

        for (byte b : bytes) {
            formatter.format("%02x", b);
        }

        return formatter.toString();
    }

    public static String calculateRFC2104HMAC(String data, String key)
        throws SignatureException, NoSuchAlgorithmException, InvalidKeyException
{
    SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);
    Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
    mac.init(signingKey);
    return toHexString(mac.doFinal(data.getBytes()));
}

public static void main(String[] args) throws Exception {
    String hmac = calculateRFC2104HMAC("5201279013028", "Cf47U2b4d4Vt5Gz8");

    System.out.println(hmac);
    byte[] encodedBytes = Base64.encodeBase64(hmac.getBytes());
    System.out.println("encodedBytes " + new String(encodedBytes));
    byte[] decodedBytes = Base64.decodeBase64(encodedBytes);
    System.out.println("decodedBytes " + new String(decodedBytes));

    }
}

1 个答案:

答案 0 :(得分:0)

看起来问题与toHexString()
有关 不要将mac.doFinal()输出转换为hex 将输出字节直接转换为base64以获得所需的结果。