Mil*_*ita 4 java sha256 hmac swift
我已经尝试了来自 stackoverflow 的几个链接来获取 HmacSHA256 和与 java 一起使用的密钥,但我总是得到
func check(body: String) -> String {
let hash = body.hmac(HMACAlgorithm.sha256, key: Router.sigKey)
print("SIG: " + Router.sigKey)
print("result of hash. \(hash)")
return hash
}
Run Code Online (Sandbox Code Playgroud)
此函数从给定的字符串返回带有键的哈希值。密钥是:0393e944ee8108bb66fc9fa4f99f9c862481e9e0519e18232ba61b0767eee8c6
字符串是:示例
结果是:27effb76c97022497e25d3a5d7e823462f212a82d9ebba35f179071568b0c335
当我使用这个网站检查我的 SHA256 是否使用相同的密钥时,它返回相同的答案,所以我知道我的 swift 代码很好。但是当我尝试在 Java 中执行此操作时,这是源代码。
public static String HMAC_SHA(){
try {
String secret = "0393e944ee8108bb66fc9fa4f99f9c862481e9e0519e18232ba61b0767eee8c6";
String message = "example";
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
String hash = android.util.Base64.encodeToString(sha256_HMAC.doFinal(message.getBytes()), Base64.URL_SAFE);
return new String(Hex.encodeHex(hash.getBytes()));
}
catch (Exception e){
e.printStackTrace();
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
它返回:4a2d5f3764736c77496b6c2d4a644f6c312d676a526938684b6f4c5a36376f3138586b4846576977777a553d0a
这甚至与 swift 输出都不相似。我如何从上面的 swift 代码中使用 java 实现相同的结果,这将很有帮助!
String key = "0393e944ee8108bb66fc9fa4f99f9c862481e9e0519e18232ba61b0767eee8c6";
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
sha256_HMAC.init(new SecretKeySpec(key.getBytes(), "HmacSHA256"));
byte[] result = sha256_HMAC.doFinal("example".getBytes());
System.out.println (DatatypeConverter.printHexBinary(result));
// ONLY CONVERT TO HEX (= SWIFT) NOT FIRST TO BASE64
Run Code Online (Sandbox Code Playgroud)
结果按要求
27EFFB76C97022497E25D3A5D7E823462F212A82D9EBBA35F179071568B0C335
Run Code Online (Sandbox Code Playgroud)
小智 -1
您的键包含大于值 127 的值,Mac并且SecretKeySpec使用bytes,在 Java 中可以包含从 -128 到 127 的值。
在 HmacSHA256 算法中,密钥被解释为十六进制值的字符串。对于您的秘密,该密钥的十进制值为:
3,147,233,68,238,129,8,187,102,252,159,164,249,159,156,134,36,129,233,224,81,158,24,35,43,166,27,7,103,238,232,198
正如您所看到的,其中一些值超过 127。当创建SecretKeySpec对象以及在类中进行计算时Mac,Java 使用byte[]它来存储此序列和相关序列。在 Java 中,abyte可以包含从 -128 到 127 的值,这意味着在存储此秘密时,> 127 的值将“翻转”,并确保随后的计算不会按您的预期进行。
在 Swift 情况下(以及 C++、Ruby 和其他语言),从十六进制到字节的转换不会丢失实际值。
| 归档时间: |
|
| 查看次数: |
12329 次 |
| 最近记录: |