如何在Java中使用带有转义文字的键字符串生成HMAC?

时间:2018-03-31 08:19:11

标签: java python sha1 cryptoapi hmacsha1

我尝试关注 to_sign

的Python:

from hashlib import sha1
from hmac import new as hmac
key = "b\316a"
to_sign = "asdf"
hmac(key, to_sign, sha1).digest().encode('base64')[:-1]

结果:

Lpn0yo6zg51Y292BW+j9EfhYBUM=

爪哇:

String key="b\316a";
String to_sign = "asdf";
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(keySpec);
byte[] result = mac.doFinal(to_sign.getBytes("UTF-8"));
BASE64Encoder.encode(result);

结果:

QbAjPUDYSD3oc68M0w5ajJp3wg8=

两者都不匹配。但是当密钥没有任何逃避文字时,两者都匹配(例如:key =" dog")。我在哪里做错了?

1 个答案:

答案 0 :(得分:-1)

"UTF-8"替换为Java代码中的"Windows-1252",您将获得相同的输出。

String key = "b\316a";
String to_sign = "asdf";
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("Windows-1252"), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(keySpec);
byte[] result = mac.doFinal(to_sign.getBytes("Windows-1252"));
System.out.println(Base64.getEncoder().encodeToString(result));

输出

Lpn0yo6zg51Y292BW+j9EfhYBUM=

Base64类是标准的Java 8。