带有密钥的Java HmacSHA256
我已经尝试了一些来自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 }
此函数返回带有给定String的键的哈希值。 关键是: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; }
它返回:4a2d5f3764736c77496b6c2d4a644f6c312d676a526938684b6f4c5a36376f3138586b4846576977777a553d0a
这与快速输出甚至不相似。 如何从上面的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
按要求结果
27EFFB76C97022497E25D3A5D7E823462F212A82D9EBBA35F179071568B0C335
您的密钥包含的值大于值127, Mac
和SecretKeySpec
使用byte
s,在Java中可以包含-128到127的值。
在HmacSHA256算法中,密钥被解释为一串hex值。 在您的秘密情况下,此密钥的十进制值为: 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中,一个byte
可以包含-128到127之间的值,这意味着当存储此秘密时,值> 127将“翻转”并确保此后的计算不会像您期望的那样。
在Swift案例中(以及使用C ++,Ruby和其他语言),从hex到字节的转换不会丢失实际值。