我尝试关注键和 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")。我在哪里做错了?
答案 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。