我在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开始,我无法弄清楚它的作用!
答案 0 :(得分:2)
尝试
echo -n "secretstring" | sha512sum -
我得到了
026620758babadb008ee7b98e1bb07351f08d49228c15f6f31c4ee75cb9a26f5079b81c01f14f78cf5f9639e49d7319ee3c3fcc1f94e686b8d605c93f2ab9fb4 -
(有一个前导零)。您的命令的问题是参数-hmac
。它适用于
echo -n "secretstring" | openssl sha512
的输出
(stdin)= 026620758babadb008ee7b98e1bb07351f08d49228c15f6f31c4ee75cb9a26f5079b81c01f14f78cf5f9639e49d7319ee3c3fcc1f94e686b8d605c93f2ab9fb4
最后,更改传递给toString()
的值会更改数字的基数(或基数)。