我一直在尝试签署对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));
}
}
答案 0 :(得分:0)
看起来问题与toHexString()
有关
不要将mac.doFinal()输出转换为hex
将输出字节直接转换为base64以获得所需的结果。