1 回答
TA贡献1786条经验 获得超11个赞
和之间有区别。 (另请参见)是一种使用-hash-algorithm 生成 a 的算法。SHA-256HMAC-SHA-256HMAC-SHA-256HMACMACSHA-256
第一个 Java-code 和 C#-code 的结果是不同的,因为 Java-code 使用SHA-256和 C#-code HMAC-SHA-256。
由于您想使用HMAC-SHA-256我专注于它,因此我忽略了第一个 Java 代码。
文本的 C# 代码的结果
This is an arbitrary text!
用钥匙
1234567890
是
25583e6e0b6c2c3a5c50ebd9ea48138a960a7ca2a215fae2b4b82ee99734deb4
第二个 Java 代码HMAC-SHA-256也使用。如果你更换线路
data = bytesToHex(sha256Hmac.doFinal(data.getBytes(StandardCharsets.UTF_8)));System.out.println(data);
和
data = bytesToHex(sha256Hmac.doFinal(value.getBytes(StandardCharsets.UTF_8)));return data;
然后,输出是相同的(前提是您的(未发布的)bytesToHex-方法以正确的方式工作,请参见例如How to convert a byte array to a hex string in Java?)。
顺便说一句,在第二个 Java 代码中,您应该将标签更改为类似的salt东西,key因为这是 a 上下文中的常用措辞MAC。盐通常与密码散列结合使用,就像在您的第一个 Java 代码中一样。
注意:在 Java 代码中,不允许使用空字节数组作为SecretKeySpec输入。这会抛出一个IllegalArgumentException (Empty key). 但是,HMACSHA256C# 代码中的 -ctor 接受一个空字节数组并在内部用 0 值填充它。因此,关于您的测试用例(文本:abcd,空键),您可以在 Java 代码中通过包含单个 0 值的字节数组来模拟空字节数组。然后,Java 代码的输出等于 C# 代码的输出。当然,空键应该只用于这个测试用例。
添加回答
举报
