将SHA-512哈希从Java转换为Bash

时间:2014-11-23 00:31:58

标签: java bash sha512

我在Java中有一个使用SHA-512散列字符串的大代码,而且我在Bash中无法获得类似的结果。因此,我决定最大限度地简化它,以便能够解决问题,并提出了这一小段代码:

import java.math.BigInteger;
import java.security.MessageDigest;

class Test {
  public static void main(String []args) throws Exception {
    String SECRET = "secret";
    String STRING = "string";
    MessageDigest digest = MessageDigest.getInstance("SHA-512");
    digest.update(SECRET.getBytes("UTF-8"));
    byte[] d = digest.digest(STRING.getBytes("UTF-8"));
    System.out.println(new BigInteger(1, d).toString(16));
  }
}

返回:

26620758babadb008ee7b98e1bb07351f08d49228c15f6f31c4ee75cb9a26f5079b81c01f14f78cf5f9639e49d7319ee3c3fcc1f94e686b8d605c93f2ab9fb4

根据我的理解,这相当于:

#!/bin/bash

SECRET="secret"
STRING="string"

echo -n "$STRING" | openssl sha512 -hmac "$SECRET"

但这会返回:

c13223b6f7331a608ec24bf3adfd8f599622b4d5b28cd27f9dcf92430a6263f435d07ff59809785ef04c5cb4aefd02357578efc8862e254a7505e26c76806194

我唯一注意到的是,如果我更改toString(16)的值,结果也会发生变化。但是从阅读its documentation开始,我无法弄清楚它的作用!

1 个答案:

答案 0 :(得分:2)

尝试

echo -n "secretstring" | sha512sum -

我得到了

026620758babadb008ee7b98e1bb07351f08d49228c15f6f31c4ee75cb9a26f5079b81c01f14f78cf5f9639e49d7319ee3c3fcc1f94e686b8d605c93f2ab9fb4 -

(有一个前导零)。您的命令的问题是参数-hmac。它适用于

echo -n "secretstring" | openssl sha512

的输出

(stdin)= 026620758babadb008ee7b98e1bb07351f08d49228c15f6f31c4ee75cb9a26f5079b81c01f14f78cf5f9639e49d7319ee3c3fcc1f94e686b8d605c93f2ab9fb4

最后,更改传递给toString()的值会更改数字的基数(或基数)。