【发布时间】:2014-11-23 00:31:58
【问题描述】:
我在 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,我不知道它是做什么的!
【问题讨论】:
-
HMAC 不只是散列键+数据,您必须使用不同的填充进行两次散列(以防止 MD 扩展攻击),请参阅tools.ietf.org/html/rfc2104。
-
@dave_thompson_085 好的,谢谢!但在这种情况下,我实际上是在尝试使用 API 进行身份验证。
-
好的,然后反转它:-) HMAC 不仅仅是哈希(键+数据)。如果您显然只想要 hash(key+data),请不要使用 HMAC。
-
@dave_thompson_085 好的,明白了:)