首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使HmacSHA1 Java与Powershell Hash匹配

使HmacSHA1 Java与Powershell Hash匹配
EN

Stack Overflow用户
提问于 2018-09-29 00:15:44
回答 1查看 214关注 0票数 0

我有这个Powershell片段,我无法更改它,并提供了我需要匹配的哈希:

代码语言:javascript
复制
$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

由此得出的结果是:

代码语言:javascript
复制
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中是这样的:

代码语言:javascript
复制
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));

其中产出:

代码语言:javascript
复制
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]

我似乎无法让Hash与Powershell输出的内容相匹配。在这两个示例中,我都使用"test“键创建了一个hmacsha1实例,然后得到了"test”的散列,但两者有一些细微的差别,导致它们给出了不同的结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-29 04:58:26

你不会得到两个不同的哈希。事实上..。

代码语言:javascript
复制
12, -108, 81, 92, 21, -27, 9, 91, -118, -121, -91, 11, -96, -33, 59, -13, -114, -48, 95, -26

是相同的

代码语言:javascript
复制
12 148 81 92 21 229 9 91 138 135 165 11 160 223 59 243 142 208 95 230

正在发生的事情是在java中,当您转到string时,它正在使这些值签名。

其中一个例子是-108和148。

代码语言:javascript
复制
00000000,10010100 = 148
11111111,10010100 = -108

如果要使字节看起来没有签名,可以使用与该字节相结合的0xFF。

代码语言:javascript
复制
byte b = (byte) Integer.parseInt("148");
System.out.println(b);

输出:-108

代码语言:javascript
复制
byte b = (byte) Integer.parseInt("148");
System.out.println(b & 0xFF);

输出:148

正在发生的情况是,您使用的是按位和运算符,所以0xFF = 255,又名11111111,并匹配公共位并保留它们。

代码语言:javascript
复制
00000000,11111111 = 255 aka 0xFF
11111111,10010100 = -108
--------
00000000,10010100 = 148
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52563986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档