【问题标题】:Convert SHA-512 hashing from Java to Bash将 SHA-512 哈希从 Java 转换为 Bash
【发布时间】: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 好的,明白了:)

标签: java bash sha512


【解决方案1】:

试试

echo -n "secretstring" | sha512sum -

我明白了

026620758babadb008ee7b98e1bb07351f08d49228c15f6f31c4ee75cb9a26f5079b81c01f14f78cf5f9639e49d7319ee3c3fcc1f94e686b8d605c93f2ab9fb4 -

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

echo -n "secretstring" | openssl sha512

输出

(stdin)= 026620758babadb008ee7b98e1bb07351f08d49228c15f6f31c4ee75cb9a26f5079b81c01f14f78cf5f9639e49d7319ee3c3fcc1f94e686b8d605c93f2ab9f4b

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

【讨论】:

    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    相关资源
    最近更新 更多