获取 HmacSHA1 Java 哈希以匹配 Powershell 哈希
Getting HmacSHA1 Java Hash to match Powershell Hash
我有这个 Powershell 片段,我无法更改它并提供了我需要匹配的哈希值:
$key = 'test'
$bytes = [Text.Encoding]::UTF8.GetBytes($key)
WRITE-HOST "bytes: " $bytes
$hmacsha = new-object system.security.cryptography.HMACSHA1
$hmacsha.key = $bytes
$hash = $hmacsha.ComputeHash($bytes)
WRITE-HOST "hash: " $hash
结果如下:
bytes: 116 101 115 116
hash: 12 148 81 92 21 229 9 91 138 135 165 11 160 223 59 243 142 208 95 230
这在 Java 中:
String key = "test";
byte[] bytes = key.getBytes("UTF-8");
System.out.println("bytes: " + Arrays.toString(bytes));
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] keyBytes = md.digest(bytes);
SecretKey sk = new SecretKeySpec(keyBytes, "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(sk);
byte[] hash = mac.doFinal(keyBytes);
System.out.println("hash 1: " + Arrays.toString(hash));
sk = new SecretKeySpec(bytes, "HmacSHA1");
mac = Mac.getInstance("HmacSHA1");
mac.init(sk);
hash = mac.doFinal(bytes);
System.out.println("hash 2: " + Arrays.toString(hash));
输出:
bytes: [116, 101, 115, 116]
hash 1: [-112, -37, 64, 65, -91, -97, 36, 60, -80, -110, 62, -105, -63, -69, -79, -18, 29, -95, 23, -116]
hash 2: [12, -108, 81, 92, 21, -27, 9, 91, -118, -121, -91, 11, -96, -33, 59, -13, -114, -48, 95, -26]
我似乎无法获得哈希以匹配 Powershell 输出的内容。在这两个示例中,我都创建了一个带有 "test" 键的 hmacsha1 实例,然后获取 "test" 的哈希值,但两者都有一些细微差别,导致它们给出不同的结果。
您没有得到 2 个不同的哈希值。事实上...
12, -108, 81, 92, 21, -27, 9, 91, -118, -121, -91, 11, -96, -33, 59, -13, -114, -48, 95, -26
与
相同
12 148 81 92 21 229 9 91 138 135 165 11 160 223 59 243 142 208 95 230
当您转向字符串时,java 中发生的事情是使这些值签名。
例如 -108 和 148
00000000,10010100 = 148
11111111,10010100 = -108
如果要使字节看起来无符号,可以将 0xFF 与字节结合使用。
byte b = (byte) Integer.parseInt("148");
System.out.println(b);
输出:-108
byte b = (byte) Integer.parseInt("148");
System.out.println(b & 0xFF);
输出:148
您正在使用按位与运算符
所以 0xFF = 255 aka 11111111 并匹配公共位并保留它们。
00000000,11111111 = 255 aka 0xFF
11111111,10010100 = -108
--------
00000000,10010100 = 148
我有这个 Powershell 片段,我无法更改它并提供了我需要匹配的哈希值:
$key = 'test'
$bytes = [Text.Encoding]::UTF8.GetBytes($key)
WRITE-HOST "bytes: " $bytes
$hmacsha = new-object system.security.cryptography.HMACSHA1
$hmacsha.key = $bytes
$hash = $hmacsha.ComputeHash($bytes)
WRITE-HOST "hash: " $hash
结果如下:
bytes: 116 101 115 116
hash: 12 148 81 92 21 229 9 91 138 135 165 11 160 223 59 243 142 208 95 230
这在 Java 中:
String key = "test";
byte[] bytes = key.getBytes("UTF-8");
System.out.println("bytes: " + Arrays.toString(bytes));
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] keyBytes = md.digest(bytes);
SecretKey sk = new SecretKeySpec(keyBytes, "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(sk);
byte[] hash = mac.doFinal(keyBytes);
System.out.println("hash 1: " + Arrays.toString(hash));
sk = new SecretKeySpec(bytes, "HmacSHA1");
mac = Mac.getInstance("HmacSHA1");
mac.init(sk);
hash = mac.doFinal(bytes);
System.out.println("hash 2: " + Arrays.toString(hash));
输出:
bytes: [116, 101, 115, 116]
hash 1: [-112, -37, 64, 65, -91, -97, 36, 60, -80, -110, 62, -105, -63, -69, -79, -18, 29, -95, 23, -116]
hash 2: [12, -108, 81, 92, 21, -27, 9, 91, -118, -121, -91, 11, -96, -33, 59, -13, -114, -48, 95, -26]
我似乎无法获得哈希以匹配 Powershell 输出的内容。在这两个示例中,我都创建了一个带有 "test" 键的 hmacsha1 实例,然后获取 "test" 的哈希值,但两者都有一些细微差别,导致它们给出不同的结果。
您没有得到 2 个不同的哈希值。事实上...
12, -108, 81, 92, 21, -27, 9, 91, -118, -121, -91, 11, -96, -33, 59, -13, -114, -48, 95, -26
与
相同12 148 81 92 21 229 9 91 138 135 165 11 160 223 59 243 142 208 95 230
当您转向字符串时,java 中发生的事情是使这些值签名。
例如 -108 和 148
00000000,10010100 = 148
11111111,10010100 = -108
如果要使字节看起来无符号,可以将 0xFF 与字节结合使用。
byte b = (byte) Integer.parseInt("148");
System.out.println(b);
输出:-108
byte b = (byte) Integer.parseInt("148");
System.out.println(b & 0xFF);
输出:148
您正在使用按位与运算符 所以 0xFF = 255 aka 11111111 并匹配公共位并保留它们。
00000000,11111111 = 255 aka 0xFF
11111111,10010100 = -108
--------
00000000,10010100 = 148